一道莫名其妙的華爲面試題解法

學習gdb的時候,看到一篇帖子:華爲面試題(8分鐘寫出代碼) 點進去一看,竟然是2006年的老帖子,也不知道爲什麼突然又被頂起來了,痛恨標題黨!既然進來了,也就想了想思路吧。

最開始因爲受標題的影響,覺得8分鐘能寫出來代碼,應該不會太複雜,估計O(n)能搞定,那當然不能排序了。具體思路是:讓A數組減去B數組對應下標得出C數組,想辦法通過修改C中的元素符號,使C數組的元素和爲零或者最接近零即可。這裏我想了這樣一個方法,求出當前C的和S,然後只需要找出S/2的值,逆轉符號就可以了,怎麼實現呢,我想的是能不能通過一遍遍歷來找到這個值,思考了半天,發現O(n)實現這個思路不可行。

想不出來了,開始看後面的帖子,比較多的一種思路是:排序,然後或者從頭或者從尾以此取元素,哪個和小就哪個取。貌似看着挺正確的,其實是錯誤的。假如安裝從頭開始取元素,給出測試數據A(1,2,3,4)B(1,2,3,9999),這組測試數據得出的應該還是A(1,2,3,4)B(1,2,3,9999),正確答案應該是A(1,1,2,999)B(2,3,3,4)。如果從最大的元素開始取,那麼把AB數組都加上負號,便是針對這個思路的一個反例。

後來,看到有些提到了揹包,想想確實,其實就是0/1揹包問題,揹包的大小是AB元素和的一半,元素是AB的全部元素。其實我最開始的思路想到後面應該也可以提示出來是0/1揹包了,但通過減法之後不一定最後得出的是正確結果,需要證明過程,這有點超出我的思路了。

發佈了81 篇原創文章 · 獲贊 7 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章