标签:
有这样一个问题:在一条左右水平放置的直线轨道上任选两个点,放置两个机器人,请用如下指令系统为机器人设计控制程序,使这两个机器人能够在直线轨道上相遇。(注意两个机器人用你写的同一个程序来控制)。
指令系统:只包含4条指令,向左、向右、条件判定、无条件跳转。其中向左(右)指令每次能控制机器人向左(右)移动一步;条件判定指令能对机器人所在的位置进行条件测试,测试结果是如果对方机器人曾经到过这里就返回true,否则返回false;无条件跳转,类似汇编里面的跳转,可以跳转到任何地方。
ok,这道很有意思的趣味题是去年微软工程院的题,文末将给出解答。同时,我们看到其实这个题是一个典型的追赶问题,那么追赶问题在哪种面试题中比较常见?链表追赶,这篇文章就好好说说在链表中的追赶问题。
这里说的环形链表是整个链表都是一个环形的,也就是链表的尾结点的next指向了第一个结点。那么看他们的追赶问题。
再看另外的一种情况,就是两个指针的位置不相同。fast在low的前面k的位置:
上面的分析其实就两个过程:
第一个过程就是链表的环检测,如果两个指针能够相遇,说明一定存在环,否则的话fast指针一定先到末尾的NULL了。
注意:没有中间那个i次移动的结点过程和状态,这里仅仅用于分析问题。
第二个过程就是从链表的碰撞点到链表环的入口结点的距离和从整个链表的第一个结点到链表环的的入口结点的距离是相等的。我们这里没有办法找到这个距离到底是多少,但是可以分别用两个同速度的指针,从两个起始点开始移动,相遇的点就是链表环的入口结点。
首先这个链表要的存在环,如果没有环的话,直接返回0。所以第一步还是链表的环检测,如果两个指针发生了碰撞,那么这个链表存在环。
然后就可以计算环中的结点的个数了,只需要记下来刚才的碰撞点,这个碰撞点一定在环内部,然后在往后遍历,直到再一次的到达这个碰撞点,那么就可以直到环中结点的个数了。
标签:
原文地址:http://www.cnblogs.com/stemon/p/4766777.html