74.叠盘子排序 题解及思路 | 豆包MarsCode AI刷题

3 阅读4分钟

74.叠盘子排序 题解及思路

74.叠盘子排序

问题描述

题目描述如下:

小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 都应单独列出。

示例1:

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

解释: -3、-2、-1三个数连续,满足题目条件,合并为13--1

18、19、20三个数连续,满足题目条件,合并为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、-2、-1、0,1三个数以上连续,满足题目条件,合并为-3-1

3、4、5三个数连续,满足题目条件,合并为3-5

7、8、9、10、11三个数以上连续,满足题目条件,合并为7-11

17、18、19、20三个数以上连续,满足题目条件,合并为17-20

示例3:

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

解释:

7、8、9、10、11三个数以上连续,满足题目条件,合并为7-11

解题思路

int l = 0;:定义了一个整型变量l,用于标记连续数字区间的起始索引位置

创建了一个StringBuffer对象ans,最终要返回的字符串

  • for (int r = 1; r < plates.length; r++):从数组的第二个元素(索引为 1)开始遍历数组plates,这样做是因为在后续判断连续数字时需要对比当前元素和前一个元素(索引为r的元素与索引为r - 1的元素对比)。

  • if (plates[r]!= plates[r - 1] + 1):条件判断检查当前元素是否与前一个元素连续(按数值上连续,即相邻元素差值为 1)。如果不连续,则进入以下不同的处理分支:

  • if (r - l >= 3):当前不连续位置(索引r)与连续区间起始位置(索引l)之间的元素个数大于等于 3 时,说明存在一个较长的连续数字区间,此时将这个区间以 “起始数字 - 结束数字” 的格式添加到ans中,例如ans.append( plates[l]).append("-").append( plates[r - 1] ).append( ",");,末尾添加逗号。

  • else分支:如果当前不连续区间内的元素个数小于 3,意味着这只是几个孤立的数字,通过循环逐个将这些数字添加到ans中,代码为for (int i = l; i < r; i++) { ans.append( plates[i]).append(","); },每个数字后也添加逗号进行分隔。

  • 不管是哪种情况,处理完当前不连续区间后,都会执行l = r;,这是将连续区间的起始索引更新为当前位置(r),以便开始标记下一个可能的连续区间。

循环结束后,还需要单独处理数组中最后一段区间(因为循环结束时最后一段区间还未完整处理)。同样根据这段区间的长度判断处理方式:

  • if(plates.length - l >=3):如果从最后记录的连续区间起始位置(索引l)到数组末尾的元素个数大于等于 3,按照连续区间格式将其添加到ans中,即ans.append( plates[l]).append("-").append( plates[plates.length - 1]).append(",");
  • else分支:若元素个数小于 3,则通过循环逐个添加最后这段区间内的数字到ans中,代码是for (int i = l; i < plates.length; i++) { ans.append( plates[i]).append(","); }

最后将最后多余的逗号去掉

java代码
public static String solution(int[] plates, int n) {
    // Please write your code here
    int l =0;
    StringBuffer  ans = new StringBuffer();
    for (int r = 1; r < plates.length; r++) {
        if (plates[r]!= plates[r-1]+1){
            if (r -l >=3){
                ans.append( plates[l]).append("-").append( plates[r-1] ).append( ",");
            }else{
                for (int i = l; i < r; i++) {
                    ans.append( plates[i]).append(",");
                }
            }
            l = r;
        }
    }

    if(plates.length - l >=3){
        ans.append( plates[l]).append("-")
                .append( plates[plates.length-1])
                .append(",");
    }else{
        for (int i = l; i < plates.length; i++) {
            ans.append( plates[i]).append(",");
        }
    }

    if (!ans.isEmpty()){
        ans.setLength(ans.length()-1);
    }
    System.out.println(ans.toString());
    return ans.toString();
}