问题描述
小F正在进行一个 AB 实验,需要从整数位置 x 移动到整数位置 y。每一步可以将当前位置增加或减少,且每步的增加或减少的值必须是连续的整数(即每步的移动范围是上一步的 -1,+0 或 +1)。首末两步的步长必须是 1。求从 x 到 y 的最少步数。
输入描述
输入包含两个整数 x 和 y,表示起始位置和目标位置。
输出描述
输出从 x 到 y 所需的最小步数。
测试样例
样例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、0 或 +1)。
- 第一步和最后一步的步长必须是
1。 - 我们需要求出从起点
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
}
}