汇总区间(简单)
题目来源:力扣
解题
- 暴力循环
class Solution {
public List<String> summaryRanges(int[] nums) {
List<String> result=new ArrayList<>();
//处理异常情况
if(nums==null)
return null;
else if(nums.length==1){
result.add(String.valueOf(nums[0]));
return result;
}
int begin=0;
for(int i=0;i<nums.length;i++){
int add=1;
begin=nums[i];
//add判断不能过界且寻找到相同范围的最大值
while(i+add<nums.length && begin+add==nums[i+add]){
add++;
}
//开始值与结束值不相等说明有个区间
if(begin!=nums[i+add-1]){
result.add(begin+"->"+nums[i+add-1]);
i=i+add-1;
}
//相等则无区间
else{
result.add(begin+"");
}
}
return result;
}
}
- 双指针
class Solution {
public List<String> summaryRanges(int[] nums) {
List<String> res = new ArrayList<>();
// i 初始指向第 1 个区间的起始位置
int i = 0;
for (int j = 0; j < nums.length; j++) {
// j 向后遍历,直到不满足连续递增(即 nums[j] + 1 != nums[j + 1])
// 或者 j 达到数组边界,则当前连续递增区间 [i, j] 遍历完毕,将其写入结果列表。
if (j + 1 == nums.length || nums[j] + 1 != nums[j + 1]) {
// 将当前区间 [i, j] 写入结果列表
if (i != j) {
res.add(nums[i]+"->"+nums[j]);
}
else
res.add(nums[i]+"");
// 将 i 指向更新为 j + 1,作为下一个区间的起始位置
i = j + 1;
}
}
return res;
}
}
用stringbuilder存储字符串竟然用时快了这么多
class Solution {
public List<String> summaryRanges(int[] nums) {
List<String> res = new ArrayList<>();
// i 初始指向第 1 个区间的起始位置
int i = 0;
for (int j = 0; j < nums.length; j++) {
// j 向后遍历,直到不满足连续递增(即 nums[j] + 1 != nums[j + 1])
// 或者 j 达到数组边界,则当前连续递增区间 [i, j] 遍历完毕,将其写入结果列表。
if (j + 1 == nums.length || nums[j] + 1 != nums[j + 1]) {
// 将当前区间 [i, j] 写入结果列表
StringBuilder sb = new StringBuilder();
sb.append(nums[i]);
if (i != j) {
sb.append("->").append(nums[j]);
}
res.add(sb.toString());
// 将 i 指向更新为 j + 1,作为下一个区间的起始位置
i = j + 1;
}
}
return res;
}
}