“叠盘子排序”题目要求
一、问题描述
小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"
三、题目解析
3.1代码思路
-
初始化变量:初始化相关参数:
StringBuilder用于构建最终的字符串结果。start和endy用来跟踪当前连续序列的开始和结束。 -
遍历数组:- 使用一个循环遍历
plates数组。在循环中,检查当前元素是否与前一个元素连续。 -
处理连续序列:如果当前元素与前一个元素连续,继续扩展当前序列。如果当前元素与前一个元素不连续,检查当前序列的长度是否满足至少3个盘子的条件。
- 如果满足,将序列格式化为
start-end的形式。 - 如果不满足,将序列中的每个元素单独添加到结果中。
- 如果满足,将序列格式化为
-
处理最后一个序列:循环结束后处理最后一个序列。
-
返回结果:将
StringBuilder转换为字符串并返回。
3.2详细代码
public static String solution(int[] plates, int n) {
StringBuilder result = new StringBuilder();
int start = plates[0];
int end = plates[0];
for (int i = 1; i < n; i++) {
if (plates[i] == end + 1) {
// 当前元素与前一个元素连续
end = plates[i];
} else {
// 当前元素与前一个元素不连续,处理当前序列
result.append(formatSequence(start, end));
result.append(",");
// 更新 start 和 end 为当前元素
start = plates[i];
end = plates[i];
}
}
// 处理最后一个序列
result.append(formatSequence(start, end));
return result.toString();
}
private static String formatSequence(int start, int end) {
if (end - start >= 2) {
return start + "-" + end;
} else {
// 如果序列长度不足3,单独列出每个元素
StringBuilder sb = new StringBuilder();
for (int i = start; i <= end; i++) {
sb.append(i);
if (i != end) {
sb.append(",");
}
}
return sb.toString();
}
}
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"));
}
}
四、知识总结
这个题目最重要的是如何识别连续数字并且将超过三个的连续数字加入输出结果当中。解决这道题的关键思想:通过遍历数组中的每个元素,判断当前元素是否与前一个元素连续。如果当前元素与前一个元素连续,则扩展当前序列的结束位置。如果当前元素与前一个元素不连续,则需要处理当前序列,并开始一个新的序列。这些操作都是通过控制start和end的指向来实现。对于满足条件的连续序列,将其格式化为 start-end 的形式。对于不满足条件的序列,将其中的每个元素单独列出。在遍历结束后,需要单独处理最后一个序列。使用 StringBuilder 来高效地构建最终的结果字符串。