当青训营遇上码上掘金-主题3:寻友之旅

61 阅读2分钟

题目:寻友之旅

小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)

请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)

思路:理性分析

当看到这个题的时候就觉得此题特别简单,这是一道一个很符合切合现实生活中的情景的题目。坐车和步行两种前进方式,坐车一分钟,所在位置就乘2(其实有点越来越快的感觉哈,还是指数级别的增长速度,hhhh),然后步行一分钟位置是加1。

因为情景非常简单,关键点就是在于最后一步上,因为前期肯定是乘2的做法更为合适,直到到达某一个临界点(再坐车一分钟就超过了或者恰好抵达小码所在的位置,当然直接恰好抵达就没有歧义了,这里考虑超过的情形)。所以在这里就是直接比较到达临界点后是直接下车走过去还是再坐一站然后往回步行走过去这两种情况,哪一种情况用时更短就选择哪种情况。

一个特殊情况,当 N >= K 时, 因为公交车只能往前走,所以我们就只能选择步行。

还有一个更为特殊的情况,尤其需要注意,就是数据取极值的问题,如果N恰好是0,这个时候再直接乘2的话就陷入死循环了,一直是0。所以此时可以先给两人的位置都加上1,表示先走一步考虑之后的问题。

代码:作品链接

[python实现的寻友之旅](find_friend - 码上掘金 (juejin.cn))