華為面試題:
寫乙個程式, 要求功能:求出用1 ,2 ,5 這三個數不同個數組合的和為100 的組合個數。如:100 個1 是乙個組合,5 個1 加19 個5 是乙個組合。。。。 請用c++ 語言寫。
答案:
最容易想到的演算法是:
設x 是1 的個數,y 是2 的個數,z 是5 的個數,number 是組合數;注意到0<=x<=100 ,0<=y<=50 ,0<=z=20 ,所以可以程式設計為:
上面這個程式一共要迴圈100*50*20 次,效率實在是太低了。。。。
事實上,這個題目是一道明顯的數學問題,而不是單純的程式設計問題。簡單的解法如下:
因為x+2y+5z=100 ,所以x+2y=100-5z ,且z<=20 x<=100 y<=50 ,所以(x+2y)<=100 ,且(x+5z) 是偶數
對z 作迴圈,求x 的可能值如下:
z=0, x=100, 98, 96, ... 0
z=1, x=95, 93, ..., 1
z=2, x=90, 88, ..., 0
z=3, x=85, 83, ..., 1
z=4, x=80, 78, ..., 0
......
z=19, x=5, 3, 1
z=20, x=0
因此,組合總數為100 以內的偶數+95 以內的奇數+90 以內的偶數+...+5 以內的奇數+1 ,即為:(51+48)+(46+43)+(41+38)+(36+33)+(31+28)+(26+23)+(21+18)+(16+13)+(11+8)+(6+3)+1。
某個偶數m 以內的偶數個數(包括0 )可以表示為m/2+1=(m+2)/2 ,某個奇數m 以內的奇數個數也可以表示為(m+2)/2
所以,求總的組合次數可以程式設計為:
這個程式, 只需要迴圈21 次, 兩個變數,就可以得到答案, 比上面的那個程式高效了許多倍----一切 只是因為作了一些簡單的數學分析。。。。
面試演算法題總結 一
思想,每次隨機取乙個數,將大於其的放在右邊,小於或等於其的放在左邊,如此遞迴 def quicksort arr if len arr 1or len list filter lambda a a arr 0 arr len arr return arr middle random.choice r...
面試演算法題
前幾天,一好友去筆試,有一題 現在有1000個蘋果,和10個箱子,如何把這1000個蘋果裝在這10個箱子裡,才能使不管任何數量 1 1000 的蘋果,都能一次給出?當時,我們都想,出題這人。今天,在想移位的時候,突然想到了,這絕對是二進位制數的變種。分析 1000個蘋果,最接近1024,轉化為2進製...
面試演算法題
1 直方圖矩形最大值 class solution s.push i return res 2 第n個醜數 class solution return res.back 3 lru cache 最近最少使用頁面置換快取器 class lrucache int get int key void set...