打点计时器的区间合并| 豆包MarsCode AI刷题

81 阅读6分钟

刷题学习笔记:以打点计数器问题为例

一、题目解析

本次解析的题目是设计一个打点计数器相关的编程问题。给定多个递增的数字范围,需要将这些范围合并,计算其中唯一数字的个数。

(一)思路

解决这个问题的关键思路是利用数据结构的特性来处理数字范围和去重。这里使用TreeSet是一个很好的选择,因为TreeSet在 Java 中具有自动去重和排序的功能。

具体步骤如下:

  1. 遍历输入的二维数组(每个元素是一个数字范围)。
  2. 对于每个数字范围,使用一个循环将范围内的所有数字添加到TreeSet中。由于TreeSet的特性,重复的数字会自动被去除。
  3. 最后返回TreeSet的大小,即唯一数字的个数。

(二)代码详解

以下是代码中的关键部分:

收起

java

复制

public static int solution(int[][] inputArray) {
    TreeSet<Integer> set = new TreeSet<>();
    // 遍历二维数组,将每个区间内的数字添加到TreeSet中,利用其自动去重和排序的特性
    for (int[] interval : inputArray) {
        for (int i = interval[0]; i <= interval[1]; i++) {
            set.add(i);
        }
    }
    return set.size();
}
  • 首先创建了一个TreeSet对象set,用于存储数字。

  • 外层for循环遍历输入的二维数组inputArray,其中interval代表每个数字范围数组。

  • 内层for循环根据数字范围,将从interval[0]interval[1]的每个数字添加到TreeSet中。

  • 最后返回TreeSet的大小,这就是计数器打点的数量。

main方法中,可以看到对solution函数的简单测试:

收起

java

复制

public static void main(String[] args) {
    //  可以添加更多测试用例在这里
    int[][] testArray1 = {{1, 4}, {7, 10}, {3, 5}};
    int[][] testArray2 = {{1, 2}, {6, 10}, {11, 15}};

    System.out.println(solution(testArray1) == 9);
    System.out.println(solution(testArray2) == 12);
}

这里创建了两个测试用例testArray1testArray2,并通过System.out.println验证solution函数的结果是否正确。

二、知识总结

(一)新知识点

  1. TreeSet 的使用:了解到TreeSet是 Java 集合框架中的一部分,它基于红黑树实现。它有两个重要的特性,一是自动对元素进行排序,二是不允许存储重复的元素。在处理需要去重和排序的数据场景中非常有用。
  2. 二维数组的遍历:在处理像本题这样的二维数组(其中每个元素又是一个数组表示数字范围)时,需要使用嵌套的for循环。外层循环遍历二维数组的每一行(每个数字范围),内层循环遍历每个数字范围的具体数字。

(二)理解

对于TreeSet,它内部的排序和去重机制可以大大简化代码逻辑。例如在本题中,如果不使用TreeSet,手动实现去重和排序功能会比较复杂。同时,理解二维数组的遍历方式有助于处理更复杂的数据结构和算法问题,因为很多算法问题的输入数据可能是多维的。

(三)学习建议

对于刚入门的同学:

  1. 要深入理解数据结构的特性,比如TreeSet这种不常用的数据结构,可以通过编写简单的示例代码来熟悉它的方法和功能。
  2. 在处理数组遍历问题时,尤其是多维数组,要清晰地理解每个循环的作用和索引的变化。可以通过画图或者手动模拟循环过程来加深理解。
  3. 多做类似的练习题,巩固对这些知识点的掌握,并且尝试自己修改题目条件,看看如何调整代码来适应新的需求。

三、学习计划

(一)制定刷题计划

  1. 确定目标:根据自己的学习进度和目标,比如如果是初学者,可以先从简单的数据结构和算法问题入手,像本题这种涉及基本集合操作和数组遍历的题目。如果是有一定基础的,可以选择更复杂的算法问题,如动态规划、图算法等。
  2. 安排时间:每天或每周安排固定的时间来刷题。例如,每天晚上抽出 1 - 2 个小时专门用于刷题和学习相关知识。可以将时间分成两部分,一部分用于解题,另一部分用于复习和总结。
  3. 分阶段学习:将学习过程分成几个阶段。比如第一阶段专门学习基本数据结构(数组、链表、栈、队列、树等)相关的题目,每个数据结构安排一定数量的题目进行练习。第二阶段可以学习算法相关的题目,如排序算法、搜索算法等。

(二)利用错题进行针对性学习

  1. 整理错题:当遇到做错的题目时,将题目、自己的错误解法、正确解法都记录下来。可以使用电子文档或者纸质笔记本。分析自己做错的原因,是对知识点不理解,还是解题思路有问题。
  2. 复习错题:定期复习错题,重新做一遍,看看是否已经掌握正确的解法。如果还是做错,要再次分析原因,可能需要重新学习相关的知识点。
  3. 拓展学习:对于一些因为知识点欠缺导致的错误,要进行拓展学习。比如本题如果是因为对TreeSet不熟悉而做错,除了学习TreeSet的基本用法,还可以学习其他相关的集合类,了解它们的区别和适用场景。

四、工具运用

(一)与其他学习资源结合

  1. 在线教程:可以结合在线的 Java 教程,如慕课网、网易云课堂等平台上的相关课程。当在刷题过程中遇到某个知识点不清楚时,可以在这些平台上搜索相关的课程进行深入学习。例如,如果对TreeSet的底层实现原理不理解,可以找专门讲解集合框架底层实现的课程。
  2. 书籍:参考经典的 Java 编程书籍,如《Effective Java》《Java 核心技术》等。在刷题过程中,如果遇到一些代码规范或者更深入的语言特性问题,可以从这些书籍中寻找答案。比如在本题中,如果想进一步优化代码的性能,可以参考书籍中关于集合操作的优化建议。
  3. 论坛和社区:参与 Java 相关的论坛和社区,如 Stack Overflow、开源中国等。当遇到难题或者有独特的解题思路时,可以在这些平台上与其他开发者交流。比如可以在论坛上分享本题的解题方法,看看其他开发者有没有更好的建议或者其他实现方式。这样可以拓宽自己的视野,学习到更多的编程技巧和最佳实践。