问题描述
小明正在设计一台打点计数器,该计数器可以接受多个递增的数字范围,并对这些范围内的每个唯一数字打点。如果多个范围之间有重叠,计数器将合并这些范围并只对每个唯一数字打一次点。小明需要你帮助他计算,在给定的多组数字范围内,计数器会打多少个点。
例如,给定三个数字范围 [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
问题理解
我们需要计算多个区间合并后的总点数,并且不重复计算重叠的部分。例如,给定区间 [1, 4] 和 [3, 5],合并后应该是 [1, 5],总点数为 5。
数据结构选择
-
Set:
- 使用
Set来存储所有不重复的点。Set的特性是自动去重,非常适合用来存储不重复的点。
- 使用
算法步骤
-
初始化
Set:- 创建一个
Set来存储所有不重复的点。
- 创建一个
-
遍历每个区间:
- 对于每个区间
[start, end],将start到end之间的所有点加入到Set中。
- 对于每个区间
-
计算
Set的大小:Set的大小就是计数器打出的点数。
具体步骤
-
初始化
Set:- 创建一个
HashSet来存储所有不重复的点。
- 创建一个
-
遍历区间并添加点:
- 对于每个区间
[start, end],使用一个循环将start到end之间的所有点加入到Set中。
- 对于每个区间
-
返回
Set的大小:Set的大小就是计数器打出的点数。
代码
import java.util.HashSet; import java.util.Set;
public class Main { public static int solution(int[][] inputArray) { // 初始化一个Set来存储所有不重复的点 Set points = new HashSet<>();
// 遍历每个区间
for (int[] range : inputArray) {
int start = range[0];
int end = range[1];
// 将区间内的所有点加入到Set中
for (int i = start; i <= end; i++) {
points.add(i);
}
}
// Set的大小就是计数器打出的点数
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
}
}
总结
通过使用 Set 来存储所有不重复的点,我们可以轻松地处理区间合并和去重的问题。遍历每个区间并将区间内的点加入到 Set 中,最后 Set 的大小就是我们需要的结果。