有位朋友給出了一道題:
有兩列火車相距100千公尺,在同一條軌道上相向行駛,一列火車的速度是每小時30千公尺,另一列的速度是每小時20千公尺。當兩列火車相距100千公尺時,乙隻鳥以120千公尺的時速開始從火車a飛向火車b,到達後再飛回火車a,如此往復直至兩列火車相撞。當兩列火車相撞時,鳥一共飛了多遠?
看到這道題,第一直覺是 100 千公尺,可不就是兩列火車一共行駛的距離麼 ?錯了。這是受到了腦筋急轉彎的影響,但是彎轉錯了額。你能想象人體內的血管連起來可以繞地球兩周半嗎 ?
不能馬上得出結論,只好計算了。第一次鳥飛了 100 / (120+20) 120 = 600/7 千公尺;第二次鳥飛了 (600/7 - 150 /7 ) / (120+30) 120 = 360 / 7 , …… ,算起來沒完沒了了 。
仔細想想,肯定有巧解之法。你想到了麼 ?
朋友說,這個問題如果能夠從最終結果反推,就很容易得到答案了。嗯,這是她的獨特心得。
我能從中獲得什麼收穫呢 ?能夠跳出條框的思考,固然很棒, 但在那一剎那的靈感突現之前,其實並不容易做到。
進而我想到,這道題有兩種求解思維:一種加法思維,一種乘法思維。第一本能是加法思維,把每一趟鳥飛的距離加起來,但是計算繁瑣;不容易想到的是乘法思維:鳥飛行的距離 = 鳥飛行的時間 * 速度。當想到這一點時,彷彿在一瞬間獲得了某種洞察力。你超越了表面的極具迷惑性的形式。
這說明,我們在求解問題時,常常容易陷入到第一本能思維,被形式牽著走。但其實跳出來一看,是否還有其他的途徑呢 ?不妨先發散一下。
這就好比深度優先遍歷演算法和廣度優先遍歷演算法。深度優先遍歷演算法,一根筋走到底,不入死胡同不回頭;廣度優先遍歷演算法,則會先找出所有可能的途徑,然後沿著某個途徑再尋找多個途徑。依次反覆。
在思考解決方案的初期,顯然廣度優先遍歷更容易讓人看到整體,更容易讓人去探索一種洞察力,而不被本能思維所束縛,儘管本能思維在處理常規問題上游刃有餘。
一道演算法題,引發的思考
引言 有人問我這樣乙個問題,希望寫出 實現 有p0,p1兩點座標,組成乙個線段,求此線段與x點的的距離 我並不知道,如何完全的實現此功能,因為求點與線的公式,我記得是高中知識,但是我已經忘得差不多了,只是知道勾股定理算兩點間距離,直線方程有個斜率,如果給我時間去細想的話,應該可以理出頭緒,得到個寫此...
一道面試題引發的思考
首先我們給出這道面試題的 以及題目 lista new arraylist list.add 1 list.add 2 for string item list 問 上段 執行會報錯嗎?如果把 1 換成 2 會報錯嗎?為什麼?首先給出答案 上面這段 執行不會報錯。把 1 換成 2 再執行就會報錯。為...
java 與 一道小題引發的思考
第一眼看這個題,以為會編譯不通過,結果正確答案會輸出 true。ps 是乙個賦值運算子,賦給某個變數乙個具體的值。是乙個比較運算子 1 基本型和基本型進行 運算子的比較,直接比較兩個值 2 基本型和封裝型進行 運算子的比較,封裝型將會自動拆箱變為基本型後再進行比較 3 封裝型和封裝型進行 運算子的比...