标题:叠盘子排序 | 豆包MarsCode AI刷题
题目解析
思路
本题要求编写程序帮助小M确定盘子的叠放方式。输入参数是一个整数数组 plates,表示盘子的序号,以及盘子总数 n。输出应按照连续递增的顺序排列,并且至少包含3个盘子。如果不能满足这个条件,则单独列出。
算法的核心思想是遍历数组,找到连续递增的盘子序列,并将其合并。具体步骤如下:
- 初始化变量
start和end分别指向当前连续递增序列的起始位置和结束位置。 - 遍历数组,当遇到下一个盘子的序号等于前一个盘子的序号加1时,更新
end。 - 当遇到不连续的情况时,判断是否满足连续递增至少3个的条件。如果不满足,则单独列出该盘子;否则,将连续递增的序列添加到结果字符串中。
- 最终返回结果字符串。
代码详解
public class Main {
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 {
if (end - start >= 2) {
result.append(start).append("-").append(end);
} else {
for (int j = start; j <= end; j++) {
result.append(j);
if (j != end) {
result.append(",");
}
}
}
start = plates[i];
end = plates[i];
}
}
// 处理最后一个连续递增序列
if (end - start >= 2) {
result.append(start).append("-").append(end);
} else {
for (int j = start; j <= end; j++) {
result.append(j);
if (j != end) {
result.append(",");
}
}
}
// 去掉末尾多余的逗号
if (result.charAt(result.length() - 1) == ',') {
result.deleteCharAt(result.length() - 1);
}
return result.toString();
}
public static void main(String[] args) {
System.out.println(solution(new int[]{-3, -2, -1, 2, 10, 15, 16, 18, 19, 20}, 10));
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));
System.out.println(solution(new int[]{1, 2, 7, 8, 9, 10, 11, 19}, 8));
}
}
知识总结
- StringBuilder类:在Java中,
StringBuilder类提供了一个可变的字符串对象,允许我们在运行时修改其内容。这对于频繁修改字符串的操作非常有用,比如在循环中逐个添加字符。 - 数组遍历:通过for循环遍历数组是一种常见的做法,可以方便地访问数组中的每个元素并执行相应的操作。
- 条件判断:使用if语句进行条件判断,根据不同的条件执行不同的逻辑分支。
学习计划
- 每日刷题:每天抽出一段时间专门用于刷题,可以选择豆包MarsCode AI刷题平台上的题目,从易到难逐渐提高难度。
- 错题回顾:对于做错的题目,要仔细分析错误原因,理解正确的解题思路,并再次尝试解答。
- 知识点整理:每次完成一组题目后,整理所涉及的知识点,加深记忆。
- 实践应用:尝试将学到的知识点应用到实际项目中,巩固理论知识的同时提高动手能力。
工具运用
- 豆包MarsCode AI刷题:利用AI推荐系统,根据自身水平和兴趣推荐合适的题目,提高学习效率。
- 在线文档和教程:参考官方文档和高质量的在线教程,深入理解相关概念和技术细节。
- 社区交流:积极参与技术社区的讨论,向他人请教不懂的地方,分享自己的学习心得,互相促进。
通过以上方法,可以有效地提升编程技能和解决问题的能力。