C++叠盘子排序 | 豆包MarsCode AI刷题

57 阅读3分钟

题目

叠盘子排序
问题描述

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

  • 盘子叠放后会被分为多堆,每一堆都可能是由一个或多个盘子组成
  • 叠放在同一堆的盘子的序号都是不间断递增的(例如 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;
}