问题描述
小F正在进行一个 AB 实验,需要从整数位置 x 移动到整数位置 y。每一步可以将当前位置增加或减少,且每步的增加或减少的值必须是连续的整数(即每步的移动范围是上一步的 -1,+0 或 +1)。首末两步的步长必须是 1。求从 x 到 y 的最少步数。
输入描述
输入包含两个整数 x 和 y,表示起始位置和目标位置。
输出描述
输出从 x 到 y 所需的最小步数。
解答思路
题目理解
题目要求我们从整数位置 x 移动到整数位置 y,每一步的移动范围是上一步的 -1,+0 或 +1,且首末两步的步长必须是 1。我们需要找到从 x 到 y 的最少步数。
解题思路
-
计算绝对距离:首先计算从
x到y的绝对距离abs,即abs = Math.abs(xPosition - yPosition)。 -
特殊情况处理:如果
abs小于等于 3,直接返回abs,因为这种情况下可以直接一步一步移动到目标位置。 -
平方根计算:计算
abs的平方根sq,并根据sq的值来判断最少步数:- 如果
sq * sq == abs,说明abs是一个完全平方数,最少步数为2 * sq - 1。 - 如果
sq * sq < abs且abs <= sq * (sq + 1),说明abs在一个平方数和下一个平方数之间,最少步数为2 * sq。 - 否则,最少步数为
2 * sq + 1。
- 如果
代码详解
-
计算绝对距离:
int abs = Math.abs(xPosition - yPosition); -
特殊情况处理:
if (abs <= 3) { ... } -
平方根计算:
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; }
完整代码
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;
}
}