備注:幾天之前凌晨6點醒了,也許是心血來潮,突然想用手機記下自己當時思考的幾道百度算法面試題,
題目是在園子里看到的。草稿記在QQ日志草稿箱里。
已下為正文:
1.大整數相乘。
計算機表示整數的范圍有限,那怎么實現兩大整數相乘呢?
想了下沒有思路,咨詢了google大牛,看到有人是這樣實現的:
大整數用字符串表示,每個大整數每一個數字字符轉換為對應的整數,存入一維數組中,
然后被乘數的每一位數字分別與乘數的每一位數字相乘,結果保存在另一一維數組中,
此一維數組的大小為:被乘數的個數*乘數的個數,最后處理進位。
此方法用計算機模擬了兩數相乘的過程。還有沒有更好的方法?我暫時沒查到也沒想到。
既然大整數相乘計算機不能直接處理,自然而然會想到大整數相除呢?大整數相加呢?大整數相減呢?
大整數加減用計算機模擬人計算的過程很容易,難就難在大整數相除。
想到了兩中方法:
1.對大整數因式分解,直至每個因子計算機能表示
2.跟乘法一樣用計算機模擬,但是實現起來有些復雜,需要綜合使用大整數乘法,大整數減法,大整數比較。
第二題很簡單,這里就略過了。
3.有2n+1個數,有n個數重復,找出那個不同的數。
一開始沒有完全理解有n個數重復這句話,要完成這道題很簡單,可以先排序再找,也可以兩重循環遍歷,本來這道題沒有分析的必要,
但是看了園友的回復,有一個很巧妙的方法,利用位運算的異或性質,時間復雜度為n,a異或b異或b=a,a異或b=b異或a.這手機坑爹啊,異或符號打不出來。
4.有個樓梯,每次只能上一階或者兩階,到第N次的時候,總共走了多少階?把所有可能的情況打印出來。
題目大概是這個意思。剛開始不知道怎么下手,每次走的階數不固定,這有好多種情況,腦袋亂了,這可咋算?
根據概率來算有2的n次方種情況。看到園友的回復是一個費波那鍥數列,園主的回答是可以使用動態規划,這些方法可以解決這個問題?
動態規划方法求最值才適用。某個時候突然想到:這個是不是可以使用遞規來實現?