叠盘子排序

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

代码展示

#include #include #include

std::string solution(std::vector &plates, int n) { std::string result = ""; int start = 0;

for (int i = 1; i <= n; ++i) {
    if (i == n || plates[i] != plates[i - 1] + 1) {
        if (i - start >= 3) {
            if (!result.empty()) {
                result += ",";
            }
            result += std::to_string(plates[start]);
            if (i - start > 1) {
                result += "-";
                result += std::to_string(plates[i - 1]);
            }
        } else {
            for (int j = start; j < i; ++j) {
                if (!result.empty()) {
                    result += ",";
                }
                result += std::to_string(plates[j]);
            }
        }
        start = i;
    }
}

return result;

}

int main() { // You can add more test cases here std::vector 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;

return 0;

}

代码解释

  1. 初始化:我们初始化一个空字符串 result 来存储最终的结果,并设置 start 变量来记录当前区间的起始位置。

  2. 遍历盘子序号:从第一个盘子开始遍历到最后一个盘子。

    • 如果当前盘子与前一个盘子不是连续的,或者已经遍历到最后一个盘子,则检查当前区间的长度。
    • 如果区间长度大于等于3,则将该区间作为一个堆添加到结果中。
    • 否则,将该区间内的每个盘子单独添加到结果中。
  3. 更新起始位置:每次处理完一个区间后,更新 start 为下一个区间的起始位置。

  4. 返回结果:最终返回拼接好的结果字符串。

通过这种方式,我们可以确保每个堆中的盘子序号是不间断递增的,并且每堆中至少有3个盘子。如果某个区间内的盘子数量少于3个,则这些盘子会被单独列出。