Felix 接觸編程半年左右,一直用的是蘋果公司的 Swift 編程語言。新年伊始開始玩第二種編程語言,古老的 c++ 。今天在黑客榜網站 HackerRank 上的挑戰是,用 c++ 在四個整數中挑出最大的。
如果您覺得這是個容易的問題的話,我可以告訴您,智商超高的學習編程近三年的七年級小朋友,在半個小時內尚未找到令人滿意的方案。他隻是用了個土辦法搞定這個問題,仍在找尋更加合理的解決辦法,即“算法”。
Felix 思考了幾分鍾後,徑直寫下了這樣的代碼:
他一路寫著,我一路感動著。
這位在半年前,當時他還在四年級,我給他測智商時,20題全對的愛好廣泛的小朋友,果然邏輯性極強。他采用的辦法大致可以這樣描述:準備好三個空盒子,用於存放兩個數比較後的大者。待比較的四個數分別為 a,b,c,d。頭兩個數 a 和 b 比較後,大的放進第一個盒子裏。然後用第一個盒子裏的數與 c 比較,把大的裝進第二個盒子。最後再用這第二個盒子裏的數與最後那個尚未參與比較的 d 進行比較,大的裝進第三個盒子,這就是最後要找的 a,b,c,d 中最大的了。
他解決了問題,通過了 HackerRank 的挑戰。
這時候我說:“Felix,等一等。你用了三個盒子裝比較後的結果(大的數)。咱們真的需要三個盒子嗎?是不是一個就夠了?”
話音未落,Felix 就明白了,刷刷刷寫下了讓我無比欣慰的算法。即一個一個比較,不斷把大的裝進唯一的盒子,最後盒子裏留下的必然是最大的數。
順便說一下前麵提到的“土辦法”。思路是,
如果 a 大於 b 並且 a 大於 c 並且 a 大於 d 答案則為 a;
如果 b 大於 a 並且 b 大於 c 並且 b 大於 d 答案則為 b;
如果 c 大於 a 並且 c 大於 b 並且 c 大於 d 答案則為 c;
如果 d 大於 a 並且 d 大於 b 並且 d 大於 c 答案則為 d;
這種辦法的弱勢是,比較的次數多,而且是難擴展的,比如不是 4 個數,而是 40 個 400 個數甚至更多。