题目
叠盘子排序
问题描述
小明是个讲究生活质量的人,家里的一切都井井有条,比如说家中的盘子都是一个系列,每个盘子都标有唯一的一个整数作为标识。在每次吃完饭后,小明都会将这些盘子按照特定的顺序叠放收拾起来,收拾的规则如下:
- 盘子叠放后会被分为多堆,每一堆都可能是由一个或多个盘子组成
- 叠放在同一堆的盘子的序号都是不间断递增的(例如 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"
思路解析
1.将输入的数组(盘子编号)从小到大排序(可以用algorithm库里自带的sort方法)
2.遍历盘子编号的数组,同时检测此时的下一位是否连续,若连续继续判断,直至不连续,再判断连续的数字个数是否大于等于三,若符合条件,按题目要求添加“first-last,”,否则只添加当前数字+“,”
3.题目中的整型数字转字符串,可以用to_string(value)
4.记得删掉ans最后一个“,”
C++代码
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
std::string solution(std::vector<int> &plates, int n)
{
sort(plates.begin(),plates.end()); //sort排序,默认从小到大排序
string ans = ""; //存放答案的字符串
for(int i=0;i<plates.size();i++)
{
int j = i+1; //用于检测下一位是否连续
int count = 1; //用于判断连续数字的个数是否满足大于等于三,一开始的数字算一个,初始化为一
while(j<plates.size()&&plates[j]==plates[i]+count) //如果j不越界且plates[j]连续,继续判断下一位直至不连续
{
j++;
count++;
}
if(count>=3) //如果连续数字的个数大于等于3,在ans后面加上plates[i]和plates[j-1]
{
ans = ans + to_string(plates[i])+"-"+to_string(plates[j-1])+","; //因为j不符合条件跳出循环,所以这里最后一位是j-1
i=j-1; //更新i的位置,因为下一个循环i会加1,要使下次判断j的位置,将i设为j-1
}
else ans = ans + to_string(plates[i])+","; //不符合条件直接加上
}
return ans.substr(0,ans.length()-1); //ans舍弃最后的“,”
}
int main() {
// You can add more test cases here
std::vector<int> 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;
//cout << (solution(plates3, 8)) << std::endl;
return 0;
}