青训营-叠盘子排序

29 阅读2分钟

问题描述

小明是个讲究生活质量的人,家里的一切都井井有条,比如说家中的盘子都是一个系列,每个盘子都标有唯一的一个整数作为标识。在每次吃完饭后,小明都会将这些盘子按照特定的顺序叠放收拾起来,收拾的规则如下:

  • 盘子叠放后会被分为多堆,每一堆都可能是由一个或多个盘子组成

  • 叠放在同一堆的盘子的序号都是不间断递增的(例如 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)将数字转为字串
    1. 使用i表示区间的起点下标,p表示区间的终点下标
      (p-i+1)>=3 输出 plates[i]-plates[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;
}