228.汇总区间

给定一个无重复元素的有序整数数组 nums

返回 恰好覆盖数组中所有数字最小有序 区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x

列表中的每个区间范围 [a,b] 应该按如下格式输出:

  • "a->b" ,如果 a != b
  • "a" ,如果 a == b

示例 1:

1
2
3
4
5
6
输入:nums = [0,1,2,4,5,7]
输出:["0->2","4->5","7"]
解释:区间范围是:
[0,2] --> "0->2"
[4,5] --> "4->5"
[7,7] --> "7"

对比检查数组中的连续出现数组

这是双while循环的经典应用,注意对边界条件的判断,这种类型叫做:分组循环

适用场景:按照题目要求,数组会被分割成若干段,且每一段的判断/处理逻辑是一样的。

Solution

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
29
30
31
32
33
34
35
36
37
38
39
class Solution {
// summaryRanges方法用于找出数组中所有连续区间,并以字符串形式返回这些区间
public List<String> summaryRanges(int[] nums) {
// 创建一个用于存储结果字符串的列表
List<String> ret = new ArrayList<String>();
// 初始化当前索引i为0
int i = 0;
// 获取数组的长度n
int n = nums.length;
// 当当前索引小于数组长度时,执行循环
while (i < n) {
// 记录当前区间的起始位置low
int low = i;
// 将索引向前移动一位
i++;
// 当当前索引小于数组长度且当前元素与前一个元素连续时,继续移动索引
while (i < n && nums[i] == nums[i - 1] + 1) {
i++;
}
// 记录当前区间的结束位置high
int high = i - 1;
// 将区间起始位置的元素转换为字符串
String lows = String.valueOf(nums[low]);
// 将区间结束位置的元素转换为字符串
String highs = String.valueOf(nums[high]);
// 如果区间起始位置小于结束位置,说明区间包含多个元素
if (low < high) {
// 将起始和结束位置用"->"连接,并添加到结果列表中
ret.add(lows + "->" + highs);
} else {
// 如果区间只包含一个元素,则直接添加该元素到结果列表中
ret.add(lows);
}
}
// 返回包含所有连续区间的结果列表
return ret;
}
}