題目
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 };