青训营X豆包MarsCode 技术训练营第一课

58 阅读3分钟

计算从位置 x 到 y 的最少步数

问题描述

小F正在进行一个 AB 实验,需要从整数位置 x 移动到整数位置 y。每一步可以将当前位置增加或减少,且每步的增加或减少的值必须是连续的整数(即每步的移动范围是上一步的 -1+0+1)。首末两步的步长必须是 1。求从 xy 的最少步数。

输入描述

输入包含两个整数 xy,表示起始位置和目标位置。

输出描述

输出从 xy 所需的最小步数。


测试样例

样例1:

输入:x_position = 12, y_position = 6 输出:4

样例2:

输入:x_position = 34, y_position = 45 输出:6

样例3:

输入:x_position = 50, y_position = 30 输出:8

样例4:

输入:x_position = 0, y_position = 0 输出:0

算法核心思路

1.观察输入的 x 和 y 的距离 d:

  • 如果 d 是 0、1、2 或 3,那么很显然最小步数就是 d 本身。因为对于这些小距离,我们可以通过直接 +1 或 -1 的步骤到达目标位置。

2.如果 d 大于 3,那就需要采取更为复杂的策略:

  • 我们可以观察到,如果 d 是偶数,那么可以通过连续的 +1 和 -1 的步骤到达目标位置。因为每次移动 1 步,最终会将 d 减小为 0。
  • 而如果 d 是奇数,那么我们需要先通过一步 +2 或 -2 的步骤,然后再通过连续的 +1 和 -1 的步骤到达目标位置。这是因为,如果只用 +1 和 -1 的步骤,无法减小奇数距离。

3.因此,我们可以设计如下算法:

  • 初始化步长 step = 2,计数器 t = 1,累计步数 ans = 0。
  • 在 ans < (d - 2) 的条件下,重复以下步骤:
    • 如果 t 是奇数,则将 ans 加上 step,并将 t 加 1。这对应着使用 +2 或 -2 的步骤。
  • 如果 t 是偶数,则将 ans 加上 step,将 step 加 1,并将 t 加 1。这对应着使用连续的 +1 和 -1 的步骤

4.最后返回 t + 1 作为最小步数,因为需要再加上最后一步 +1 或 -1。

代码实现

public class Solution {
    public static int solution(int xPosition, int yPosition) {
        int d = Math.abs(xPosition - yPosition);
        int step = 2;
        int t = 1;
        int ans = 0;
        if (d == 0) {
            return 0;
        } else if (d == 1) {
            return 1;
        } else if (d == 2) {
            return 2;
        } else if (d == 3) {
            return 3;
        } else {
            while (ans < (d - 2)) {
                if (t % 2 == 1) {
                    ans = ans + step;
                    t = t + 1;
                } else {
                    ans = ans + step;
                    step = step + 1;
                    t = t + 1;
                }
            }
            return t + 1;
        }
    }

    public static void main(String[] args) {
        // 测试用例
        System.out.println(solution(12, 6) == 4);
        System.out.println(solution(34, 45) == 6);
        System.out.println(solution(50, 30) == 8);
    }
}

时间复杂度和空间复杂度分析

时间复杂度: O(1),因为最坏情况下需要执行的步骤数是固定的,与输入大小无关。 空间复杂度: O(1),因为只使用了几个常量变量来存储中间结果。

测试用例验证

我们提供了三个测试用例来验证代码的正确性:

当 x = 12, y = 6 时,输出应该是 4。 当 x = 34, y = 45 时,输出应该是 6。 当 x = 50, y = 30 时,输出应该是 8。 这些测试用例都已经在 main 方法中进行了验证,输出结果均为 true,表明代码实现是正确的。

结论

通过上述算法和 Java 代码实现,我们可以高效地解决从整数位置 x 移动到整数位置 y 所需的最小步数问题。该算法具有较低的时间和空间复杂度,并通过测试用例的验证,证明了其正确性。这种解决方案可以应用于类似的优化问题中,为小 F 的 AB 实验提供有效的支持。