題目:寫乙個函式,輸入n,求斐波那契數列的第n項。斐波那契數列的定義如下:
解題思路:
面試官期待的使用解法,我們可以把已經得到的數列中間項儲存起來,如果下次需要計算的時候我們先查詢一下,如果前面已經計算過就不用再重複計算了。
更簡單的辦法時從下往上計算,首先根據f(0)和f(1)算出f(2),再根據f(1)和f(2)算出f(3)。。。以此類推就可以算出第n項了。
實現**如下:
解題思路:首先我們考慮最簡單的情況。如果只有1級台階,那顯然只有一種跳法。如果有2級台階,那就有兩種跳的方法了:一種是分兩次跳,每次跳1級;另外一種就是一次跳2級。
接著我們再來討論一般的情況。我們把n級台階時的跳法堪稱是n的函式,記為f(n)。當n>2時,第一次跳的時候就有兩種不同的選擇:一是第一次只跳1級,此時跳法數目等於後面剩下的n-1級台階的跳法數目,幾位f(n-1);另外一種選擇是第一次跳2級,此時跳法數目等於後面剩下的n-2級台階的跳法數目,即為f(n-2).因此n級台階的不同跳法的總數f(n)=f(n-1)+f(n+2).分析到這裡,我們就不難看出這實際上就是斐波那契數列了。
題目三:二進位制中1的個數
題目:請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如把9表示成二進位制是1001,有2為是1.因此如果輸入9,該函式輸出是2.
常規解法:為了避免死迴圈,我們可以不右移輸入的數字i。首先把i和1做與運算,判斷i的最低為是不是為1.接著把1左移一位得到2,再和i做與運算,就能判斷i的次地位是不是1.。。。這樣反覆左移,每次都能判斷i的其中一位是不是1.基於這種思路,我們可以把**修改如下:
能給面試官帶來驚喜的解法:
我們把上面的分析總結起來就是:把乙個整數減去1,再和原整數做與運算,會把該整數最右邊乙個1變成0.那麼乙個整數的二進位制表示中有多少個1,就可以進行多少次這樣的操作。基於這種思路,我們可以寫出新的**
用一條語句判斷乙個整數是不是2的整數次方。乙個整數如果是2的整數次方,那麼它的二進位制表示中有且只有一位是1,而其他所有位都是0.根據前面的分析,把這個整數減去1之後再和它自己做與運算,這個整數中唯一的1就會變成0.
輸入兩個整數m和n,計算需要改變m的二進位制表示中的多少位才能得到n。比如10的二進位制表示為1010,13的二進位制表示為1101,需要改變1010中的3位才能得到1101.我們可以分為兩步解決這個問題:第一步求這兩個數的異或,第二部統計異或結果中1的位數。
舉一反三:
把乙個整數減去1之後再和原來的整數做位與運算,得到的結果相當於是把整數的二進位制表示中的最右邊乙個1變成0.很多二進位制問題都可以用這個思路解決。
斐波那契數列 斐波那契數列python實現
斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ...
迴圈斐波那契數列 斐波那契數列應用
什麼是斐波那契數列 斐波那契數列指的是這樣乙個數列 1,1,2,3,5,8,13,21,34,55,89,144 這個數列從第3項開始,每一項都等於前兩項之和 台階問題 有一段樓梯有10級台階,規定每一步只能跨一級或兩級,要登上第10級台階有幾種不同的走法?這就是乙個斐波那契數列 登上第一級台階有一...
斐波那契數列
1 題目描述 大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項。斐波那契數列的定義如下 輸入 輸入可能包含多個測試樣例,對於每個測試案例,輸入包括乙個整數n 1 n 70 輸出 對應每個測試案例,輸出第n項斐波那契數列的值。2 這是九度上的乙個題,要求時間限制1秒,整數的...