问题描述
小S正在玩一个关于石子的游戏,给定了一些石子,它们位于一维数轴的不同位置,位置用数组 stones 表示。如果某个石子处于最小或最大的一个位置,我们称其为端点石子。
在每个回合,小S可以将一颗端点石子移动到一个未占用的位置,使其不再是端点石子。游戏继续,直到石子的位置变得连续,无法再进行任何移动操作。
你需要帮助小S找到可以移动的最大次数。
测试样例
样例1:
输入:
stones = [7, 4, 9]
输出:2
样例2:
输入:
stones = [6, 5, 4, 3, 10]
输出:3
样例3:
输入:
stones = [1, 2, 3, 4, 5]
输出:0
问题理解
小S在玩一个石子游戏,石子分布在一维数轴上,我们需要计算在游戏结束前,小S最多可以移动石子的次数。游戏规则允许小S将位于数轴两端的石子移动到其他位置,直到所有石子连续排列,无法再移动。
解题思路
- 排序石子:首先,我们需要对石子的位置进行排序,以便确定哪些石子是端点石子。
- 确定连续区间:通过排序后的数组,我们可以确定石子的连续区间,即从最小石子到最大石子之间的所有位置。
- 计算移动次数:计算端点石子可以移动的次数,即最大石子位置与第二小石子位置之间的距离,减去石子总数,再加上1。这个计算基于每次移动都会减少一个端点石子的逻辑。
- 特殊情况:如果石子已经是连续的,即没有可以移动的端点石子,那么移动次数为0。
Java代码实现
import java.util.Arrays;
public class Solution {
public int maxMoves(int[] stones) {
// 如果石子数量少于3个,无法进行移动
if (stones.length < 3) return 0;
// 对石子位置进行排序
Arrays.sort(stones);
// 计算可以移动的最大次数
// 端点石子之间的距离减去石子总数加1
int maxMoves = stones[stones.length - 1] - stones[1] + 1 - (stones.length - 2);
return maxMoves;
}
}
总结
这个问题的解决关键在于理解端点石子的概念和如何通过移动它们来减少移动次数。通过排序和计算端点石子之间的距离,我们可以得出可以移动的最大次数。这种方法是有效的,并且可以通过上述Java代码实现。需要注意的是,如果石子已经是连续排列的,那么不需要任何移动,移动次数为0。