題目描述:
Given a sorted integer array without duplicates, return the summary of its ranges.
For example, given [0,1,2,4,5,7], return ["0->2","4->5","7"].
Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.
Tags Array
分析:本題是要将遞增序列中的連續片段标記出來,用雙指針來找範圍。另外還考查了将整數轉換為字元串,這需要注意整數的邊界條件和整數的符号。
/**///0ms/*/
class Solution {
public:
string int2str(int num){ //将一個合法的非負數轉換為字元串
string s;
int a = num;
if(a == 0)
s.insert(0,1,'0');
while(a){
s.insert(0,1,a%10 + '0');
a /= 10;
}
return s;
}
string convitoa(int num){ //将一個整數轉換為字元串
string s;
if(num == INT_MIN) //注意邊界條件的處理
s += "-2147483648";
else if(num == INT_MAX)
s += "2147483647";
else{
if(num < 0){ //非邊界元素,負數得在字元串之前加'-',然後将其相反數轉換為字元串添加在字元串尾部
s.push_back('-');
num = -num;
}
s += int2str(num); //是非負數,直接轉換為字元串即可
}
return s;
}
vector<string> summaryRanges(vector<int>& nums) {
vector<string> vec;
int len = nums.size();
if(len == 0)
return vec;
if(len == 1){ //處理隻有一個元素的情況
vec.push_back(convitoa(nums[0]));
return vec;
}
int i = 0,j = 1,lef = nums[i], rig = nums[j];
//雙指針來找到連續序列方差為1的起止元素。其中i是起始元素下标,j是尾部元素下标。lef是區間起始元素,rig是區間結束元素
while(j < len){
if(nums[j] == nums[j-1] + 1) //若相鄰元素相差1,那麼右指針右移
j++;
else{ //增量大于1,說明連續序列知道j的前一個元素,那麼将該區間用字元串表示出來,放到結果向量vec中
lef = nums[i];
string s;
s += convitoa(lef); //将lef轉換位字元串
if(j - i > 1){ //如果該區間的元素個數大于1(即rig>lef),那麼把rig加進來
rig = nums[j-1];
s += "->";
s += convitoa(rig);
}
vec.push_back(s);
i = j;
j++;
}
}
//處理最後一個連續區間
lef = nums[i];
string s;
s += convitoa(lef);
if(j - i > 1){
rig = nums[j-1];
s += "->";
s += convitoa(rig);
}
vec.push_back(s);
return vec;
}
};