叠盘子排序问题

57 阅读3分钟

问题描述

小M有一个独特的方式来收拾家中的盘子。每次用餐后,他会将盘子按照他们的序号顺序叠放。盘子的序号都是唯一的整数,并且在收拾前就是递增的。小M的叠放规则是,每一堆盘子的序号都是连续递增的,并且至少包含3个盘子。需要编写程序帮助小M确定盘子的叠放方式。

例如,输入的盘子序号是 [-3, -2, -1, 2, 10, 15, 16, 18, 19, 20],按照小M的规则,连续递增序列 -3, -2, -1 可以叠在一起表示为 -3--1,而 18, 19, 20 可以叠在一起表示为 18-20。不满足连续递增至少3个的,如 2, 10, 15, 16 都应单独列出。


输入参数

  • plates: 一个整数数组,表示盘子的序号
  • n: 盘子总数

测试样例

样例1:

输入:plates = [-3, -2, -1, 2, 10, 15, 16, 18, 19, 20], n = 10
输出:"-3--1,2,10,15,16,18-20"

样例2:

输入:plates = [-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20], n = 20
输出:"-6,-3-1,3-5,7-11,14,15,17-20"

样例3:

输入:plates = [1, 2, 7, 8, 9, 10, 11, 19], n = 8
输出:"1,2,7-11,19"

解题思路

  1. 遍历数组:我们需要遍历整个数组,找到符合条件的堆。

  2. 判断堆的条件

    • 如果当前盘子与前一个盘子的差值为1,并且已经至少有2个盘子在当前堆中,则继续添加到当前堆。
    • 如果当前盘子与前一个盘子的差值不为1,或者已经至少有3个盘子在当前堆中,则结束当前堆,并开始新的堆。
  3. 生成输出字符串

    • 对于每个堆,根据堆中盘子的数量生成相应的字符串表示。

代码

public class Main { public static String solution(int[] plates, int n) { // 用于存储最终结果的列表 List result = new ArrayList<>();

    // 用于记录当前堆的起始位置
    int start = 0;
    
    // 遍历数组
    for (int i = 1; i <= n; i++) {
        // 判断是否需要结束当前堆
        if (i == n || plates[i] != plates[i - 1] + 1) {
            // 计算当前堆的长度
            int length = i - start;
            
            // 根据堆的长度生成相应的字符串表示
            if (length >= 3) {
                result.add(plates[start] + "-" + plates[i - 1]);
            } else {
                for (int j = start; j < i; j++) {
                    result.add(String.valueOf(plates[j]));
                }
            }
            
            // 更新起始位置
            start = i;
        }
    }
    
    // 将结果列表转换为字符串
    return String.join(",", result);
}

public static void main(String[] args) {
    // 你可以添加更多测试用例
    System.out.println(solution(new int[]{-3, -2, -1, 2, 10, 15, 16, 18, 19, 20}, 10).equals("-3--1,2,10,15,16,18-20"));
    System.out.println(solution(new int[]{-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20}, 20).equals("-6,-3-1,3-5,7-11,14,15,17-20"));
    System.out.println(solution(new int[]{1, 2, 7, 8, 9, 10, 11, 19}, 8).equals("1,2,7-11,19"));
}

}