叠盘子排序丨豆包MarsCode AI刷题

122 阅读6分钟

使用豆包MarsCode AI刷题平台解决小M盘子叠放问题的学习方法和心得

问题描述: 小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. 初始化

    • 创建一个列表 result 用于存储最终的结果。
    • 定义一个变量 start 用于记录当前连续序列的起始位置。
  2. 遍历数组

    • 从第二个元素开始遍历数组,检查当前元素是否与前一个元素连续。
    • 如果不连续,判断当前序列是否满足至少3个连续元素的条件:
      • 如果满足,将这个序列的起始和结束位置添加到 result 中。
      • 如果不满足,将这个序列中的每个元素单独添加到 result 中。
    • 更新 start 为当前位置。
  3. 处理最后一个序列

    • 遍历结束后,检查最后一个序列是否满足至少3个连续元素的条件:
      • 如果满足,将这个序列的起始和结束位置添加到 result 中。
      • 如果不满足,将这个序列中的每个元素单独添加到 result 中。
  4. 返回结果

    • 使用 String.join 方法将 result 中的元素用逗号连接成一个字符串并返回。 示例代码(Java):
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static String solution(int[] plates, int n) {
        // Please write your code here
        List result = new ArrayList<>();
        int start = 0;
        for (int i = 1; i < plates.length; i++) {
            if (plates[i] != plates[i - 1] + 1) {
                if (i - start >= 3) {
                    result.add(plates[start] + "-" + plates[i - 1]);
                } else {
                    for (int j = start; j < i; j++) {
                        result.add(String.valueOf(plates[j]));
                    }
                }
                start = i;
            }
        }
        if (plates.length - start >= 3) {
            result.add(plates[start] + "-" + plates[plates.length - 1]);
        } else {
            for (int i = start; i < plates.length; i++) {
                result.add(String.valueOf(plates[i]));
            }
        }
        return String.join(",", result);
    }
    public static void main(String[] args) {
        //  You can add more test cases here
        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"));
    }
}

代码解释:

  1. 导入包

    import java.util.ArrayList;
    import java.util.List;
    

    导入了 ArrayListList 类,用于存储结果。

  2. Main

    public class Main {
    

    定义了一个 Main 类。

  3. solution 方法

    public static String solution(int[] plates, int n) {
    

    这是一个静态方法,接受一个整数数组 plates 和一个整数 n 作为参数,返回一个字符串。

  4. 初始化变量

    List result = new ArrayList<>();
    int start = 0;
    

    result 用于存储最终的结果,start 用于记录当前连续序列的起始位置。

  5. 遍历数组

    for (int i = 1; i < plates.length; i++) {
        if (plates[i] != plates[i - 1] + 1) {
            if (i - start >= 3) {
                result.add(plates[start] + "-" + plates[i - 1]);
            } else {
                for (int j = start; j < i; j++) {
                    result.add(String.valueOf(plates[j]));
                }
            }
            start = i;
        }
    }
    

    遍历数组,检查当前元素是否与前一个元素连续。如果不连续,判断当前序列是否满足至少3个连续元素的条件,满足则添加到 result 中,否则逐个添加。

  6. 处理最后一个序列

    if (plates.length - start >= 3) {
        result.add(plates[start] + "-" + plates[plates.length - 1]);
    } else {
        for (int i = start; i < plates.length; i++) {
            result.add(String.valueOf(plates[i]));
        }
    }
    

    处理最后一个序列,判断是否满足至少3个连续元素的条件,满足则添加到 result 中,否则逐个添加。

  7. 返回结果

    return String.join(",", result);
    

    使用 String.join 方法将 result 中的元素用逗号连接成一个字符串并返回。

  8. main 方法

    public static void main(String[] args) {
        //  You can add more test cases here
        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"));
    }
    

    main 方法中,调用 solution 方法并打印结果,用于测试代码的正确性。

这段代码的主要功能是根据题目要求,将输入的盘子序号数组按照连续递增的规则进行分组,并返回一个字符串表示分组结果。代码通过遍历数组,判断连续序列的长度,并根据长度决定如何添加到结果列表中。

学习计划:制定计划,循序渐进

刷题需要坚持和计划,不能三天打鱼两天晒网。以下是我总结的高效学习计划:

  1. 制定目标

    • 设定一个明确的刷题目标,例如,每天刷5道题,或者每周掌握一个新的算法。
    • 将目标分解成具体的任务,例如,今天要刷哪些题目,要学习哪些知识点。
  2. 合理安排时间

    • 每天安排固定的时间段进行刷题,例如,早上起床后或者晚上睡觉前。
    • 避免长时间连续刷题,可以每刷1-2小时休息10-15分钟,保持良好的学习状态。
  3. 利用错题

    • 将做错的题目整理出来,分析错误原因,并记录下来。
    • 定期回顾错题,确保自己真正理解和掌握这些知识点。

工具运用:结合AI,提升效率

豆包MarsCode AI刷题平台提供了强大的AI功能,可以帮助我们更高效地学习:

  1. 智能提示

    • 在做题过程中,AI可以提供智能提示,帮助我们理清思路。例如,当我们遇到难题时,AI可以给出一些解题思路或者提示代码片段。
  2. 代码优化

    • AI可以帮助我们优化代码,提高代码质量和运行效率。例如,AI可以检测代码中的冗余代码,并给出优化建议。
  3. 学习资源

    • AI可以推荐相关的学习资源,例如,相关的教程、博客或者视频,帮助我们更深入地理解知识点。

总结

使用豆包MarsCode AI刷题平台进行学习,是一个循序渐进的过程。通过合理的题目解析、知识总结、学习计划和工具运用,我们可以更高效地提升编程能力。希望本文分享的学习方法和心得,能够对大家有所帮助。刷题不仅仅是完成任务,更重要的是从中学习到新的知识和技能。坚持下去,相信我们一定能够取得进步!