码迷,mamicode.com
首页 > 其他好文 > 详细

Summary Ranges

时间:2015-08-08 22:44:37      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

题目

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("");

  1.   这题思路,用pre,back两个迭代器,如果pre到back中的部分是连续的(利用变量i比较),就让back往后走,一直走到不连续的时候。
  2. 行20中 back-pre != 1 判断back有没有从pre的相对位置往后移,如果成立,则前面一段是连续的数字,需要有“->”这样的形式。在之后的位置然后恢复pre、back的相对位置。
  3. 最后一个分支,说明前面一段是一个单独的数。打印,清空、恢复pre、back。
  4. 最后循环外边的 if (i == 1) 判断出循环时,有没有将最后一个数字跳过。

    复杂度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 };

 

Summary Ranges

标签:

原文地址:http://www.cnblogs.com/ittinybird/p/4713911.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!