Java演算法面試題(006) 相遇問題(阿里)

劉近光發表於2017-12-15

問題

本題來自阿里的面試,題目為:

有A,B兩個人在X軸上,分別在零點的兩側,你只能寫go_left(每次往左走一步),go_right(每次往右走一步),if_zero(判斷當前位置是不是零點),goto (程式的第幾行),這四個語句的程式,給A、B執行一樣的程式,讓他們相遇。

問題分析

首先我們做個假設,A位於零點的左側,B位於零點的右側。

拿到這個問題後,我相信大部分人的思維都是會做這樣的嘗試:試圖讓A往右走,B往左走,試圖編寫程式實現兩人的相遇。至少我也是做了這種嘗試,但沒有找到很好的方法來實現這個問題。如果有人實現了,煩請告訴我一下:)

但很快我轉變了思路,相遇的話,並不一定非要大家都往中間節點方向走,才能夠相遇;我們也可以往一個方向走,只是達到某個條件後,有一個人能夠實現加速,追趕位於前方的另外一個人。轉變思路後,很快就能給出答案。

實現及分析

下面是我的實現方案:

LABEL_1:
            go_right
            if_zero:
                goto LABLE_2
                
            not if_zero:
                goto LABEL_1
                
LABLE_2:
            go_right
            go_right
            not if_zero:
                goto LABLE_2
開始的時候A、B同時往右走,由於B位於零點的右側,因此不會走到零點,它一直在執行LABEL_1和LABEL_2之間的程式碼;但是A位於零點的左側,在執行一段時間後,它會走到零點,此時的話,我們跳轉到LABEL_2的位置,然後一直執行LABEL_2之後的程式碼。

假設A、B執行相同的程式,執行每條語句的時間都一樣;由於A跳轉到LABEL_2標籤後,開始加速往前追趕,最終會和B相遇。

看到這裡,有木有腦洞大開的趕腳啊^_^


相關文章