问题描述
小明是个讲究生活质量的人,家里的一切都井井有条,比如说家中的盘子都是一个系列,每个盘子都标有唯一的一个整数作为标识。在每次吃完饭后,小明都会将这些盘子按照特定的顺序叠放收拾起来,收拾的规则如下:
-
盘子叠放后会被分为多堆,每一堆都可能是由一个或多个盘子组成
-
叠放在同一堆的盘子的序号都是不间断递增的(例如 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 <iostream>
#include <sstream>
#include <string>
#include <vector>
std::string solution(std::string plates) {
std::istringstream iss(plates);
std::vector<int> numbers;
int num;
std::string res = "";
// 使用istringstream从字符串中提取整数
while (iss >> num) {
numbers.push_back(num);
}
int i = 0;
while (i < numbers.size()) {
if (i == numbers.size() - 1) {
res = res + std::to_string(numbers[i]) + ",";
res.pop_back();
return res;
}
int start = numbers[i], end = numbers[i], cnt = 1;
int j = i + 1, k = i;
while (j < numbers.size()) {
while (numbers[j] - numbers[k] == 1) {
cnt++;
end = numbers[j++];
k++;
}
if (cnt >= 3) {
res = res + std::to_string(start) + "-" + std::to_string(end) + ",";
i = j;
break;
} else {
res = res + std::to_string(numbers[i]) + ",";
i ++;
break;
}
}
}
res.pop_back();
return res;
}
int main() {
// You can add more test cases here
std::cout << (solution("-3 -2 -1 2 10 15 16 18 19 20") ==
"-3--1,2,10,15,16,18-20")
<< std::endl;
std::cout << (solution(
"-6 -3 -2 -1 0 1 3 4 5 7 8 9 10 11 14 15 17 18 19 20") ==
"-6,-3-1,3-5,7-11,14,15,17-20")
<< std::endl;
std::cout << (solution("1 2 7 8 9 10 11 19") == "1,2,7-11,19") << std::endl;
return 0;
}