1. 程式人生 > >Python 經典面試題: a,b兩個序列,大小都為n,序列元素的值任意整形數,無序, 要求: 通過交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差最小 使

Python 經典面試題: a,b兩個序列,大小都為n,序列元素的值任意整形數,無序, 要求: 通過交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差最小 使

方法: 用隨機數來求出結果 解題思想: 用隨機數隨機出來所有的程式碼排列可能性,在定義次數的時候 定義的次數越大得到的結果越準確. 最終程式碼:

import random

#有很多方法是把兩個列表合成一個後排序按照一大一小的分配生成兩個列表 #但是這樣是在資料均勻的情況下,如果有一個極大的數就不成立了,此處舉例為特殊的列表 list1 = [1, 4, 6, 8, 3] list2 = [100] list_cha = [] # 定義一個儲存所有差的列表

while True: # 把兩個列表合為一個 一定要在每次迴圈的時候都建立這個總列表 # 因為一直移除當資料移除完的時候就會報錯了, # 所以要把這個列表建為 區域性變數

list_all = [] list_all.extend(list1) list_all.extend(list2) # 定義一個最終a列表,通過隨機數 time = random.randrange(1, len(list_all)) # 每次隨機出來的元素個數也是隨機的 last_a = random.sample(list_all, time) # 定義最終b列表 last_b = [] for i in last_a: # 用移除的最大好處是保證了元素的不重複, # 但是迴圈的時候要特別注意當移除完的時候會報錯 list_all.remove(i) last_b = list_all

cha = sum(last_a)-sum(last_b) # 得到兩個列表和的差 list_cha.append(cha) # 把值追加到列表中 if len(list_cha) == 1000: # 這個等於的值越大,最後得到的最小值越準確(概率) print() break #得到最小差的值, 注意:此處要用絕對值排序 min_cha = sorted(list_cha, key=abs)[0] print(min_cha)

while True: # 重複操作得到last_a, last_b 列表 list_all = [] list_all.extend(list1) list_all.extend(list2) # 最終a列表 time = random.randrange(1, len(list_all)) last_a = random.sample(list_all, time) # 最終b列表 last_b = [] for i in last_a: # 用移除的最大好處是保證了元素的不重複, # 但是迴圈的時候要特別注意當移除完的時候會報錯 list_all.remove(i) last_b = list_all # 得到兩個列表和的差 cha = sum(last_a) - sum(last_b) if cha == min_cha: # 當差等於上面求的最小差的時候 結束迴圈,列印結果 print(last_b) print(last_a) break