基本思路是使用一个变量来维护下一次 range 的起始值,比较该起始值和当前 item, 分为两种情况:
- 如果是连续的,更新下一次起始值
- 如果是不连续的,添加 range,然后更新下一次起始值。range 的计算又分为两种情况:
2.1 当前 item 虽然与起始值不连续,但 difference 相差 1,例如 (1, 3) 的情况,那么只需要添加"2"
2.2 不连续,且difference 相差大于 1,那么新的range 为起始值->(item - 1)
2.3 上面的两种情况计算 range,实际上就是计算 rangeStart, rangeEnd,如果两者相等,只添加一个数的String,若是不等,添加一个范围。这个是题目要求的,实际上也有相关的问题直接使用 range, 即便 rangeStart 与 rangeEnd 可能相等。
我的题解思路基本和上面的类似,只是我对待起始值的方式,同当前 item 一样,是 range 的边界,但都不被 range 包含。代码如下:
public List<String> findMissingRanges(int[] nums, int lower, int upper) {
String strTo = "->";
List<String> res = new LinkedList<>();
long start = (long)lower - 1;
for (int num: nums) {
long diff = num - start;
if (diff > 2) {
String missing = (start + 1) + strTo + (num - 1);
res.add(missing);
} else if (diff == 2) {
String missing = (start + 1) + "";
res.add(missing);
}
start = num;
}
// 处理 upper,和上面类似:check if (upper + 1 - start >= 2)
if (upper - start >= 1) {
String missing = (upper - start == 1) ? (start + 1) + "" : (start + 1) + strTo + upper;
res.add(missing);
}
return res;
}
这里直接使用了 long 型,原因是 edge cases [0, Integer.MAX_VALUE], [Integer.MIN_VALUE, Integer.MAX_VALUE]
, 加减1都会 overflow。