Python编程学习圈 2020-05-09

面试宝典:Python经典算法面试题实例解析_Python



五人分鱼

1、题目

A、B、C、D、E五人在某天夜里合伙捕鱼,最后疲惫不堪各自睡觉。

第二天A第一个醒来,他将鱼分为5份,扔掉多余的1条,拿走自己的一份。

B第二个醒来,也将鱼分为5份,扔掉多余的1条,拿走自己的一份。

然后C、D、E依次醒来也按同样的方式分鱼,问他们至少捕了多少条鱼?

2、解题思路

使用穷举法,假设有x条鱼,那么 x-1除以5可以整除;

剩下的鱼的数量为((x-1)/5)*4,这个数量同样满足前边的条件。

python代码如下:

def fish():  """ 五人分鱼 """  fish = 1  while True:    total = fish    enough = True    for _ in range(5):      if (total - 1) % 5 == 0:        total = (total - 1) // 5 * 4      else:        enough = False        break    if enough:      print(fish)      break    fish += 1


归并排序


面试宝典:Python经典算法面试题实例解析_Python_02

排序思想

把一个数组平分成两个数组,然后分别再把两个数组分别平均分成两个数组,直到每个数组中只有一个元素为止;

然后依次把两个数组排序合并成有序的数组,直到最终合并完成。

python代码如下:

def merge_sort(arr):  """ 归并法/分治法排序 """  if len(arr) < 2:    return arr[:]  mid = len(arr) // 2  left = merge_sort(arr[:mid])  right = merge_sort(arr[mid:])  return merge(left, right)
def merge(left, right):  print(left)  print(right)  print('\n')  result = []  index_left, index_right = 0, 0
 while index_left < len(left) and index_right < len(right):    if left[index_left] <= right[index_right]:      result.append(left[index_left])      index_left += 1    else:      result.append(right[index_right])      index_right += 1  result += left[index_left:]  result += right[index_right:]  return result


选择排序

排序原理

取需排序数组的第一个值,作为基准比较值,然后从第二个值开始循环,依次跟这个基准值做比较,如果比基准值小,则交换位置。第二次循环,则取第二个值作为基准值,依此类推。

python代码如下:

def select_sort(origin_items):  """ 选择排序算法 """  items = origin_items[:]  for i in range(len(items) -1):    min_index = i    for j in range(i + 1, len(items)):      if items[j] < items[min_index]:        min_index = j    items[i], items[min_index] = items[min_index], items[i]
 return items

冒泡排序

排序思想

从第一个数组元素开始,依次比较相邻两个元素的值,保持大的数值在后边,那么第一次循环过后,最大的一个数就到了最后的位置。

第二次循环从0开始到倒数第二个元素,因为最后一个元素已经是最大的了,无需在进行比较,然后重复上述步骤,依次类推。

python代码如下:

def bubble_sort(origin_items):  """ 冒泡排序算法 """  items = origin_items[:]  for i in range(len(items) - 1):    for j in range(0, len(items) - 1 -i):      if items[j] > items[j + 1]:        items[j], items[j + 1] = items[j + 1], items[j]  return items