39计算从位置x到y最小步数 | 豆包MarsCode AI刷题

93 阅读2分钟

问题描述

小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

这个是题目

问题解析

小F的移动规则有以下特点:

  1. 每一步的移动范围必须是连续的整数步长变化(例如:-1、0 或 +1)。
  2. 第一步和最后一步的步长必须是 1
  3. 我们需要求出从起点 x 到目标点 y 所需的最少步数

这个问题可以看作一个物理问题——小F的移动路径类似一个“抛物线”或者“梯形”:步长逐渐增大到某个值,然后逐渐减小回来。关键是找到如何控制步长,让小F刚好到达目标点。


解决思路

1. 问题建模

我们可以先计算起点和目标点之间的绝对距离:

java
复制代码
distance = Math.abs(yPosition - xPosition);

小F的移动可以分为两部分:

  • 前半部分:步长逐渐增加到某个峰值。
  • 后半部分:步长逐渐减小回到 1。

重要性质

  • 步长构成了一个连续的等差数列,等差数列的前 n 项和公式为: S=n×(n+1)2S=2n×(n+1)​ 我们需要找到最小的 n,使得 2 \times S >= distance

2. 特殊情况处理

  • 如果 x == y,那么不需要移动,直接返回 0

3. 分情况计算

  • 如果 distance 是偶数,考虑能否精确覆盖整个距离。
  • 如果 distance 是奇数,则需要额外处理(通过调整步数的奇偶性,使总步数为奇数)。

代码如下

public class Main {
    public static int solution(int xPosition, int yPosition) {
        // 1. 计算起点和目标点的距离
        int distance = Math.abs(yPosition - xPosition);
        if (distance == 0) return 0; // 如果起点和终点相同,无需移动

        // 2. 初始化步长和总步数
        int steps = 0; // 记录总步数
        int sum = 0;   // 记录当前移动的距离

        // 3. 逐步增加步长,直到覆盖到目标距离
        while (sum < distance || (sum - distance) % 2 != 0) {
            steps++;
            sum += steps;
        }

        return steps;
    }

    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
        System.out.println(solution(0, 0));   // 输出 0
    }
}