Summary Ranges
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.
解題思路:
這道題題意是,將相鄰的一組數據用區間表示。雖然mark為easy,但是麻雀雖小,卻五髒俱全,有很多陷阱的問題。
1、最開始想的是如下代碼。但有幾個問題需要注意一下。一個就是可能溢出問題,這體現在兩個方面,一個是自行編寫的數字轉字符串的代碼中,另一個是在判斷兩個數是否相鄰。因為對c++不夠了解,因此竟然不知道如何將數字轉化成字符串,於是動手寫了一個。囧。這個版本的代碼就像懶婆娘的裹腳布一樣。
class Solution {
public:
vector summaryRanges(vector& nums) {
int len = nums.size();
vector result;
if(len == 0){
return result;
}
int left = nums[0];
nums.push_back(nums[len-1]);
len++;
for(int i=1; i 1)){
if(left == nums[i-1]){
result.push_back(intToString(left));
}else{
result.push_back(intToString(left) + -> + intToString(nums[i-1]));
}
left = nums[i];
}
}
return result;
}
string intToString(int n){
if(n==0){
return 0;
}
long long lN = n;
string s = ;
if(lN<0){
s = -;
lN = -lN;
}
stack stacks;
while(lN!=0){
stacks.push(lN%10 + '0');
lN = lN/10;
}
while(!stacks.empty()){
s += stacks.top();
stacks.pop();
}
return s;
}
};
2、其實c++中可以直接將數字轉化成字符串的。在
class Solution {
public:
vector summaryRanges(vector& nums) {
int len = nums.size();
vector result;
if(len == 0){
return result;
}
int left = nums[0];
nums.push_back(nums[len-1]);
len++;
for(int i=1; i + to_string(nums[i-1]));
}
left = nums[i];
}
}
return result;
}
};
3、在網上找到另外一種解決方案,非常優雅,其答題思路就是找到每個區間的左右兩個端點,且無需哨兵。
class Solution {
public:
vector summaryRanges(vector& nums) {
int len = nums.size();
int i=0;
vector result;
while(i + to_string(nums[i + j - 1]));
i += j;
}
return result;
}
};