标签:
题目
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("");
行20中 back-pre != 1 判断back有没有从pre的相对位置往后移,如果成立,则前面一段是连续的数字,需要有“->”这样的形式。在之后的位置然后恢复pre、back的相对位置。
复杂度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 };
标签:
原文地址:http://www.cnblogs.com/ittinybird/p/4713911.html