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

问题

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

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

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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值