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

66 阅读1分钟

当青训营遇上码上掘金

主题 3:寻友之旅

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

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

  1. 如果K>=N, 那么需要等待的时间直接就是K-N
  2. 如果K<N, 优先坐公交车, 需要直到一个特殊时间点x<N, 2x>=N, 比较两个长度N-x和1 + 2x - N

体现的代码原则:

  1. 命名的规范性
  2. 主逻辑尽量放在最短缩进的位置

边界条件的考虑:

  1. N >= 0 基本上不用管
  2. K 如果等于 0, 需要考虑无法乘坐公交车, 需要先向前一步走, 然后继续看是否K>=N

数据考虑的全面性:

  1. 测试 K >= N
  2. 测试 K < N
  3. 测试 K = 0的情况

代码平台:

  1. 首先在本地的goland运行
  2. 然后在掘金的代码平台运行
  3. 但是掘金的代码平台只提供了前端, 后端很难找
package main

import (
	"math"
)

func main() {
	// N 是目标位置, K 是出发位置
	N := 21
	K := 0

	// 出发位置在目标位置之后
	if K >= N {
		println("totoal wait time: ", K-N)
		return
	}

	waitTime := 0
	if K == 0 {
		K += 1 // 先向前一步
		waitTime += 1
		if K >= N {
			println("totoal wait time: ", K-N+waitTime)
			return
		}
	}
	x := K

	for {
		if x < N && 2*x >= N {
			break
		}
		x = 2 * x
		waitTime += 1
	}
	waitTime += int(math.Min(float64(N-x), float64(1+2*x-N)))
	println("totoal wait time: ", waitTime)
}