最近我作為Python菜鳥一枚開始征戰(zhàn)Codewars,所以打算在這里記下遇到的有意思的題目。今天這第一題叫做“Best Travel”:
John和Mary計劃去一些小鎮(zhèn)旅行。Mary已經(jīng)列好了這些小鎮(zhèn)之間的距離比如ls=[50, 55, 57, 58, 60]。但是John不想開車太累,所以提出了兩個要求:1) 開車不超過某個距離比如t=174 miles 2) 只能去3個小鎮(zhèn)。
選擇哪3個小鎮(zhèn)可以讓John和Mary都滿意呢?(即找到距離之和最接近或等于t的3個小鎮(zhèn))
這道題目可以抽象成:
輸入一個整數(shù)列表ls和整數(shù)t:
1. 找出從ls中任取三個元素的所有組合
2. 計算每個組合的三個元素之和
3. 如果存在小于或等于t的和,那么從中挑出最大的,然后輸出這個最大和對應(yīng)的三元素組合
4. 如果不存在,只好返回None
實現(xiàn)要點:
1. 無序排列組合:
用itertools模塊的combinations方法
2. 求和:
用sum函數(shù)
3. 求最大值:
用max函數(shù)
4. 捕獲異常:
用try-except
借用這一題的某個best solution, 實現(xiàn)代碼為:
def choose_best_sum(t, k, ls):
import itertools
try:
return max(sum(combination) for combination in itertools.combinations(ls, k) if sum(combination) <= t)