寻友之旅 | 青训营主题创作活动

85 阅读2分钟

当青训营遇上码上掘金

活动链接:「青训营 X 码上掘金」主题创作活动入营版 开启! - 掘金 (juejin.cn)

主题介绍 ———【寻友之旅

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

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

解题思路

整个题目解释为小青在一条长为K-N的路线上行走,可选步行或者公交这两种方式,步行一分钟移动1个点位,公交是跳跃式行走2X,所以行走时应该优先选择公交,当公交行走的两倍2X超过小码的位置时,判断一下原先位置到小码的位置Y与选择公交行走2X后的位置到小码的位置Z比较,如果Y大于Z,则先选择公交,再步行向后走,否则不选公交,直接步行向前走。

核心代码

func shortTime(n int64, k int64, count int64) int64 {
   if n == k {
      return count
   }
   if k > n && (2*n-k <= k-n) {
      count = shortTime(2*n, k, count+1)
   } else { // 这之后调用函数中参数n为k,步行
      if k > n {
         count = shortTime(k, k, count+(k-n))
      } else {
         count = shortTime(k, k, count+(n-k))
      }
   }
   return count
}

注意:判断2n-k与k-n后不管结果如何,调用的n都等于k,因为之后都是直接算步行的分钟数了,直接算出来就可以。

运行结果

n = 2

k = 13

image.png