演算法篇1 - 假設你有無限數量的郵票,面值分別為6角,7角,8角,請問你最大的不可支付郵資是多少元?
阿新 • • 發佈:2021-01-30
前言
為什麼要學演算法,因為演算法在面試過程中需要掌握演算法,很多公司面試也有演算法題,所以我們可以嘗試去解題;
今天有一個朋友(手動艾特文彬)問我,這道題該怎麼理解,該怎麼去得出答案,研究了一波,並開始總結演算法篇的部落格;
看題目博主感覺這是一道小學的數學題,但是可以使用python來解答。
1、分析步驟
1、我們假設每種郵票有N張,面值分別是6、7、8毛;
2、此時總共的郵票就有3N張,我們通過各種排列組合來得到每種組合的面值和,可以存放一個列表;
3、然後得到該列表,裡面都是可以支付的郵資面值和;
4、對該列表進行去重(為什麼要去重?,因為組合出來的面值和肯定有重複的,比如6666四張六毛,888三張八毛,都會是24)
6、上述列表可以得到可支付郵資的面值數,再做一次迴圈篩選不在裡面的,得到的數值就是不可支付的郵資了;
2、實現
a = 6
b = 7
c = 8
count = 20 # 假設每種面值的張數有20張
listcount = [] # 該列表存放可以支付郵資的面值和
for x in range(count+1) :
for y in range(count+1) :
for z in range(count+1):
num = int(a*x + b*y + c*z)
listcount. append(num)
set_1 = set(listcount) # 列表轉換成集合,去重
listcount = list(set_1) # 再轉化為列表
listcount.sort() # 列表進行排序
print(listcount) # 列印列表
# 再將不可支付的郵資進行迴圈,也存放一個列表中
notcount = []
# 下面 c*count 是指最大組合值,比如最大組合值是100,那麼從1->100,依次遍歷出來,如果該值未在listcount中,可以認為該值為不可以支付郵資數
for y in range(c*count+1):
if y not in listcount :
notcount.append(y)
print(notcount)
print(notcount[-1]) # 列印不可支付郵資數的最大值
3、結果
所以 最大不可支付的郵資數為17,也就是1.7元啦啦啦!!!
有收穫記得給博主點個贊!!謝謝大家