青训营 X 豆包MarsCode 技术训练营-32. 叠盘子

250 阅读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"

输入样例(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;
}