当青训营遇上码上掘金
主题 3:寻友之旅
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)
- 如果K>=N, 那么需要等待的时间直接就是K-N
- 如果K<N, 优先坐公交车, 需要直到一个特殊时间点x<N, 2x>=N, 比较两个长度N-x和1 + 2x - N
体现的代码原则:
- 命名的规范性
- 主逻辑尽量放在最短缩进的位置
边界条件的考虑:
- N >= 0 基本上不用管
- K 如果等于 0, 需要考虑无法乘坐公交车, 需要先向前一步走, 然后继续看是否K>=N
数据考虑的全面性:
- 测试 K >= N
- 测试 K < N
- 测试 K = 0的情况
代码平台:
- 首先在本地的goland运行
- 然后在掘金的代码平台运行
- 但是掘金的代码平台只提供了前端, 后端很难找
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)
}