问题描述
小M有一个独特的方式来收拾家中的盘子。每次用餐后,他会将盘子按照他们的序号顺序叠放。盘子的序号都是唯一的整数,并且在收拾前就是递增的。小M的叠放规则是,每一堆盘子的序号都是连续递增的,并且至少包含3个盘子。需要编写程序帮助小M确定盘子的叠放方式。
例如,输入的盘子序号是 [-3, -2, -1, 2, 10, 15, 16, 18, 19, 20],按照小M的规则,连续递增序列 -3, -2, -1 可以叠在一起表示为 -3--1,而 18, 19, 20 可以叠在一起表示为 18-20。不满足连续递增至少3个的,如 2, 10, 15, 16 都应单独列出。
输入参数
plates: 一个整数数组,表示盘子的序号n: 盘子总数
测试样例
样例1:
输入:
plates = [-3, -2, -1, 2, 10, 15, 16, 18, 19, 20], n = 10
输出:"-3--1,2,10,15,16,18-20"
样例2:
输入:
plates = [-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20], n = 20
输出:"-6,-3-1,3-5,7-11,14,15,17-20"
样例3:
输入:
plates = [1, 2, 7, 8, 9, 10, 11, 19], n = 8
输出:"1,2,7-11,19"
解题思路
-
遍历数组:我们需要遍历整个数组,找到符合条件的堆。
-
判断堆的条件:
- 如果当前盘子与前一个盘子的差值为1,并且已经至少有2个盘子在当前堆中,则继续添加到当前堆。
- 如果当前盘子与前一个盘子的差值不为1,或者已经至少有3个盘子在当前堆中,则结束当前堆,并开始新的堆。
-
生成输出字符串:
- 对于每个堆,根据堆中盘子的数量生成相应的字符串表示。
代码
public class Main { public static String solution(int[] plates, int n) { // 用于存储最终结果的列表 List result = new ArrayList<>();
// 用于记录当前堆的起始位置
int start = 0;
// 遍历数组
for (int i = 1; i <= n; i++) {
// 判断是否需要结束当前堆
if (i == n || plates[i] != plates[i - 1] + 1) {
// 计算当前堆的长度
int length = i - start;
// 根据堆的长度生成相应的字符串表示
if (length >= 3) {
result.add(plates[start] + "-" + plates[i - 1]);
} else {
for (int j = start; j < i; j++) {
result.add(String.valueOf(plates[j]));
}
}
// 更新起始位置
start = i;
}
}
// 将结果列表转换为字符串
return String.join(",", result);
}
public static void main(String[] args) {
// 你可以添加更多测试用例
System.out.println(solution(new int[]{-3, -2, -1, 2, 10, 15, 16, 18, 19, 20}, 10).equals("-3--1,2,10,15,16,18-20"));
System.out.println(solution(new int[]{-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20}, 20).equals("-6,-3-1,3-5,7-11,14,15,17-20"));
System.out.println(solution(new int[]{1, 2, 7, 8, 9, 10, 11, 19}, 8).equals("1,2,7-11,19"));
}
}