问题描述
小明是个讲究生活质量的人,家里的一切都井井有条,比如说家中的盘子都是一个系列,每个盘子都标有唯一的一个整数作为标识。在每次吃完饭后,小明都会将这些盘子按照特定的顺序叠放收拾起来,收拾的规则如下:
-
盘子叠放后会被分为多堆,每一堆都可能是由一个或多个盘子组成
-
叠放在同一堆的盘子的序号都是不间断递增的(例如 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"
解题思路
为解决这个问题,我们采用双指针记录不间断递增区间起点与终点的下标,计算得出区间的长度,大于3采用『起始编号』+『-』+『终止编号』,小于3用逗号隔开。
具体步骤
- 1.字串转为数组
使用std::stoi(data)
将字串转为数字,然后保存到数组中
补充:std::string(str)
将数字转为字串 -
- 使用i表示区间的起点下标,p表示区间的终点下标
若(p-i+1)>=3
输出plates[i]-plates[p]
否则,以逗号隔开进行输出
- 使用i表示区间的起点下标,p表示区间的终点下标
算法实现
#include <iostream>
#include <string>
#include<vector>
std::string solution(std::string plates) {
// Please write your code here
std::string result;
//字串转为数组
std::vector<int> data;
int j=0;
for(int i=0;i<plates.length();i++)
{
if(plates[i]==' '||i==(plates.length()-1)){//遇到' '就开始转数字
{
std::string temp=plates.substr(j,i);
data.push_back(std::stoi(temp));
j=i+1;
}
}
}
//求不间断递增区间
int i=0;
while(i<data.size()){
j=i+1;
int p=i;//不间断区间起点为i,终点为p
while((data[j]-data[p]==1)&&j<data.size()) {j++;p++;}
if((p-i+1)>=3){
result=result+std::to_string(data[i])+'-'+std::to_string(data[p])+',';
}else {
for(int k=i;k<=p;k++)
{
result=result+std::to_string(data[k])+',';
}
}
i=p+1;
}
result=result.substr(0,result.length()-1);//去掉','
return result;
}
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;
}