題目
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"].
分析
題目的意思就是將vector中的數,表示為一個range的形式(string)。這是一道簡單的算法題,但是需要注意的地方比較多。首先函數中肯定要將vector<int>轉換成vector<string>,雖然 c++中保留了c語言中的那一套格式化字符串處理函數(sprintf()),但是不建議使用。我選擇的是ostringstream,它是從ostream繼承而來,頭文件是<sstream>,其用法和iostream類似,非常方便。
值得一提的是,不熟悉的同學通常會把clear()當做清除ostringstream流,其作用是清除錯誤標志。 代碼中我在清空的時候使用的這樣的形式:
ostringstream oss;
oss.str("");
復雜度O(n),AC。
1 class Solution {//不要忘記清空 2 public: 3 vector<string> summaryRanges(vector<int>& nums) { 4 if (nums.empty()) 5 return vector<string>(); 6 vector<string> v; 7 ostringstream oss; 8 auto pre = nums.begin(); 9 auto back = pre + 1; 10 int i = 1; 11 while (back != nums.end()) 12 { 13 if (*pre == *back - i) 14 { 15 oss.str(""); 16 oss << *pre << "->" << *back; 17 ++back; 18 ++i; 19 } 20 else if (back-pre != 1)//前面一段是連續的 21 { 22 v.push_back(oss.str()); 23 oss.str(""); 24 pre = back; 25 i = 1; 26 ++back; 27 } 28 else 29 { 30 oss << *pre; 31 v.push_back(oss.str()); 32 oss.str(""); 33 pre = back; 34 i = 1; 35 ++back; 36 } 37 } 38 if (i == 1) 39 oss << *pre;//上一段不是連續的,把那個孤立的值打印出來 40 v.push_back(oss.str()); 41 return v; 42 } 43 };