问题
本题来自阿里的面试,题目为:
有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相遇。
看到这里,有木有脑洞大开的赶脚啊^_^