Python编程学习圈 2020-05-09
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代码如下:
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