Java算法面试题(006) 相遇问题(阿里)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010096900/article/details/78817376

问题

本题来自阿里的面试,题目为:

有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相遇。

看到这里,有木有脑洞大开的赶脚啊^_^


猜你喜欢

转载自blog.csdn.net/u010096900/article/details/78817376