问题描述
小明是个讲究生活质量的人,家里的一切都井井有条,比如说家中的盘子都是一个系列,每个盘子都标有唯一的一个整数作为标识。在每次吃完饭后,小明都会将这些盘子按照特定的顺序叠放收拾起来,收拾的规则如下:
- 盘子叠放后会被分为多堆,每一堆都可能是由一个或多个盘子组成
- 叠放在同一堆的盘子的序号都是不间断递增的(例如 1,2,3 为不间断递增,而 1,3,4 则只是普通的递增),并且这些盘子的数量至少是 3 个
- 这些盘子的序号在被叠放之前就是递增的
请问你可以编写一个程序,帮助小明算一算盘子该如何叠放么?
输入格式
空格分隔输入所有的数字
输出格式
一个字符串,每个堆被逗号分隔开,如果堆中只有一个盘子,就用序号表达;如果堆中有多个盘子,用『起始编号』+『-』+『终止编号』来表达。
输入样例(1)
-3 -2 -1 2 10 15 16 18 19 20
输出样例(1)
"-3--1,2,10,15,16,18-20"
输入样例(2)
-6 -3 -2 -1 0 1 3 4 5 7 8 9 10 11 14 15 17 18 19 20
输出样例(2)
"-6,-3-1,3-5,7-11,14,15,17-20"
输入样例(3)
1 2 7 8 9 10 11 19
输出样例(3)
"1,2,7-11,19"
代码展示
#include #include #include
std::string solution(std::vector &plates, int n) { std::string result = ""; int start = 0;
for (int i = 1; i <= n; ++i) {
if (i == n || plates[i] != plates[i - 1] + 1) {
if (i - start >= 3) {
if (!result.empty()) {
result += ",";
}
result += std::to_string(plates[start]);
if (i - start > 1) {
result += "-";
result += std::to_string(plates[i - 1]);
}
} else {
for (int j = start; j < i; ++j) {
if (!result.empty()) {
result += ",";
}
result += std::to_string(plates[j]);
}
}
start = i;
}
}
return result;
}
int main() { // You can add more test cases here std::vector plates1 = {-3, -2, -1, 2, 10, 15, 16, 18, 19, 20}; std::cout << (solution(plates1, 10) == "-3--1,2,10,15,16,18-20") << std::endl;
std::vector<int> plates2 = {-6, -3, -2, -1, 0, 1, 3, 4, 5, 7,
8, 9, 10, 11, 14, 15, 17, 18, 19, 20};
std::cout << (solution(plates2, 20) == "-6,-3-1,3-5,7-11,14,15,17-20")
<< std::endl;
std::vector<int> plates3 = {1, 2, 7, 8, 9, 10, 11, 19};
std::cout << (solution(plates3, 8) == "1,2,7-11,19") << std::endl;
return 0;
}
代码解释
-
初始化:我们初始化一个空字符串
result来存储最终的结果,并设置start变量来记录当前区间的起始位置。 -
遍历盘子序号:从第一个盘子开始遍历到最后一个盘子。
- 如果当前盘子与前一个盘子不是连续的,或者已经遍历到最后一个盘子,则检查当前区间的长度。
- 如果区间长度大于等于3,则将该区间作为一个堆添加到结果中。
- 否则,将该区间内的每个盘子单独添加到结果中。
-
更新起始位置:每次处理完一个区间后,更新
start为下一个区间的起始位置。 -
返回结果:最终返回拼接好的结果字符串。
通过这种方式,我们可以确保每个堆中的盘子序号是不间断递增的,并且每堆中至少有3个盘子。如果某个区间内的盘子数量少于3个,则这些盘子会被单独列出。