打点计数的区间合并

95 阅读3分钟

小明正在设计一台打点计数器,该计数器可以接受多个递增的数字范围,并对这些范围内的每个唯一数字打点。如果多个范围之间有重叠,计数器将合并这些范围并只对每个唯一数字打一次点。小明需要你帮助他计算,在给定的多组数字范围内,计数器会打多少个点。

例如,给定三个数字范围 [1, 4], [7, 10], 和 [3, 5],计数器首先将这些范围合并,变成 [1, 5] 和 [7, 10],然后计算这两个范围内共有多少个唯一数字,即从 1 到 5 有 5 个数字,从 7 到 10 有 4 个数字,共打 9 个点。


测试样例

样例1:

输入:inputArray = [[1, 4], [7, 10], [3, 5]]
输出:9

样例2:

输入:inputArray = [[1, 2], [6, 10], [11, 15]]
输出:12

样例3:

输入:inputArray = [[1, 3], [2, 6], [8, 10]]
输出:9

Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

import java.util.HashSet;

import java.util.Set;

public class Main {

    public static int solution(int[][] inputArray) {

        // 创建一个集合来存储所有不重复的点

        Set points = new HashSet<>();

        // 遍历每个区间

        for (int[] range : inputArray) {

            int start = range[0];

            int end = range[1];

            // 将区间内的所有点添加到集合中

            for (int i = start; i <= end; i++) {

                points.add(i);

            }

        }

        // 返回集合的大小,即计数器打出的点数

        return points.size();

    }

    public static void main(String[] args) {

        int[][] testArray1 = {{1, 4}, {7, 10}, {3, 5}};

        int[][] testArray2 = {{1, 2}, {6, 10}, {11, 15}};

MarsCode AI

MarsCode AI

好的,让我们来逐步解决这个问题。首先,我们需要理解题目要求:计算多个区间合并后的总点数,并且不重复计算重叠的部分。

解题思路

  1. 数据结构选择

    • 使用一个集合(如 HashSet)来存储所有不重复的点。
  2. 算法步骤

    • 遍历每个区间。
    • 对于每个区间,将区间内的所有点添加到集合中。
    • 最后,集合的大小就是计数器打出的点数。

代码提示

以下是代码的框架,关键步骤用注释标出:

java

import java.util.HashSet;

import java.util.Set;

public class Main {

    public static int 

    solution(int[][] 

    inputArray) {

        // 创建一个集合来存储

        所有不重复的点

        Set 

        points = new 

        HashSet<>();

        // 遍历每个区间

        for (int[] range 

        : inputArray) {

            int start = 

            range[0];

            int end = 

            range[1];

            // 将区间内的所

            有点添加到集合中

            for (int i = 

            start; i <= 

            end; i++) {

                points.add

                (i);

            }

        }

        // 返回集合的大小,即

        计数器打出的点数

        return points.size

        ();

    }

    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) == 

        7); // 应该输出 

        true

        System.out.println

        (solution

        (testArray2) == 

        9); // 应该输出 

        true

    }

}

关键步骤解释

  1. 创建集合:使用 HashSet 来存储所有不重复的点。
  2. 遍历区间:对于每个区间 [start, end],将区间内的所有点 start 到 end 添加到集合中。
  3. 返回集合大小:集合的大小就是计数器打出的点数。

你可以根据这个框架继续完善代码,确保所有细节都正确处理。如果有任何问题,欢迎继续提问!

如何处理输入数组中的重叠范围?

给我一些代码提示

帮我检查一下编辑区的代码