题目解析:计算从位置x到y的最少步数 | 豆包MarsCode AI刷题

45 阅读2分钟

问题描述

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

输入描述

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

输出描述

输出从 x 到 y 所需的最小步数。

解答思路

题目理解

题目要求我们从整数位置 x 移动到整数位置 y,每一步的移动范围是上一步的 -1+0 或 +1,且首末两步的步长必须是 1。我们需要找到从 x 到 y 的最少步数。

解题思路

  1. 计算绝对距离:首先计算从 x 到 y 的绝对距离 abs,即 abs = Math.abs(xPosition - yPosition)

  2. 特殊情况处理:如果 abs 小于等于 3,直接返回 abs,因为这种情况下可以直接一步一步移动到目标位置。

  3. 平方根计算:计算 abs 的平方根 sq,并根据 sq 的值来判断最少步数:

    • 如果 sq * sq == abs,说明 abs 是一个完全平方数,最少步数为 2 * sq - 1
    • 如果 sq * sq < abs 且 abs <= sq * (sq + 1),说明 abs 在一个平方数和下一个平方数之间,最少步数为 2 * sq
    • 否则,最少步数为 2 * sq + 1

代码详解

  1. 计算绝对距离int abs = Math.abs(xPosition - yPosition);

  2. 特殊情况处理if (abs <= 3) { ... }

  3. 平方根计算int sq = (int) Math.sqrt(abs);

  4. 根据平方根判断最少步数

    • if (sq * sq == abs) { n = sq + sq - 1; }
    • else if (sq * sq < abs && abs <= sq * (sq + 1)) { n = sq * 2; }
    • else { n = sq * 2 + 1; }

完整代码

public class Main {
    public static int solution(int xPosition, int yPosition) {
        int abs = Math.abs(xPosition - yPosition);
        int n = 0;
        if (abs <= 3) {
            if (abs == 0) {
                return 0;
            } else
                return abs;
        }
        int sq = (int) Math.sqrt(abs);
        if (sq * sq == abs)
            n = sq + sq - 1;
        else if (sq * sq < abs && abs <= sq * (sq + 1)) {
            n = sq * 2;
        } else {
            n = sq * 2 + 1;
        }
        
        return n;
    }
}