Leetcode-Summary Ranges

本题给你一个已经排好序的整形数组(元素不会出现重复),求其中数字连续的片段。
例如:A[0,1,2,4,5,7],返回[“0-2”,”4->5”,”7”].

本题思路:从头遍历一遍数组,如果a[i]+1 != a[i+1],那么在a[i]与a[i+1]不连续,就输出a[start]->a[i],其中start为开始的位置,提前记录下就好。
几个注意点:
1、如果连续片段只有一个数字,就只输出该数字,并非”数字->数字”
2、每次开始找连续片段前,可以提前判断下是否有丢失的数字,如果没有,就没必要遍历,直接可以返回。
例如:A[1,2,3,4,5] 因为,A[4]-A[0]+1 == A.size()。表示数组是连续的,没有数字丢失。因此就可以直接返回结果,节省时间。
3、整形数组,考虑它的范围
4、边缘条件:空数组,元素只要一个

代码如下

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
class Solution {
public:
string ToString(int n)
{

char r[32];
sprintf(r,"%d",n);
return string(r);
}
vector<string> summaryRanges(vector<int>& nums)
{
vector<string>res;
if(nums.empty()) return res; //边缘条件
if(nums.size() == 1)
{
res.push_back(ToString(nums.front()));
return res;
}
long long cnt = nums.back() - nums.front() + 1 - nums.size(); //判断数组片段是否连续
if(cnt == 0)
{
res.push_back(ToString(nums.front())+"->"+ToString(nums.back()));
return res;
}
bool flag = false;
int startIndex , i;
for (i=0; i<nums.size() && cnt != 0;++i)
{
if(!flag)
{
startIndex = i;//记录每次开始寻找时的起始位置
if(nums.back() - nums[i] + 1 == nums.size() - i)//判断从该起始位置开始到数组末尾,是否为连续的数组
{
cnt = 0;
break;
}
flag = true;
}
if(nums[i] + 1 != nums[i+1]) //相邻元素间判断
{
if(startIndex == i)
res.push_back(ToString(nums[startIndex]));
else
res.push_back(ToString(nums[startIndex])+"->"+ToString(nums[i]));
flag = false;
cnt--;
}
}
if(cnt == 0)
{
if(i<nums.size()-1)
res.push_back(ToString(nums[i])+"->"+ToString(nums.back()));
else
res.push_back(ToString(nums[i]));
}
return res;
}
};