当青训营遇上码上掘金

396 阅读2分钟

当青训营遇上码上掘金

我选择 主题 3:寻友之旅,它的题目如下:

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

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

解题思路

首先,分析题目可以知道是公交车不可以向后走,当小青n比小码k大时,就说明不能坐公交,因为公交不能倒退,所以只能选择步行。当n比k小的时, 就说明可以公交或者步行。

我的思路是先判断小青步行到小码的分钟数是多少然后再计算乘坐公交车的时间。目的是为了取乘坐公交车的时间取公交车直达时间以及公交车+步行最短时间这两者的最短值

代码如下

public class Main {
    public static void main(String[] args) {
    Main main = new Main();
    int result = main.result(3, 4);
    System.out.println(result);
}
public int result(int n, int k) {
    int minTime = 0;//最少时间
    if (n > k) {
        //如果n>k的话 就说明不能坐公交,因为公交不能倒退,所以只能选择步行。
        minTime = n - k;
    } else if (n < k) {
        //如果n<k的话 就说明可以公交或者步行
        int tmp = k - n;//步行时间
        while (n < k) {
            n *= 2;
            minTime++;
        }
        if (n != k) {
            int a = minTime + (n - k);
            int b = (minTime - 1) + (k - (n / 2));
            if (a > b) minTime = b;
            else minTime = a;
        }
        if (minTime > tmp) {
            minTime = tmp;
        }
    }
    //如果n==k的话 直接返回0
    return minTime;
}
}