• LeetCode OJ: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"].

    就是概括区间的方式把一个数组表示下来,例如123用1->3代替,自己写的很乱 ,维护两个指针就可以了:

     1 class Solution {
     2 public:
     3     vector<string> summaryRanges(vector<int>& nums) {
     4         int start = 0;
     5         stringstream str;
     6         vector<string> ret;
     7         int sz = nums.size();
     8         if(sz == 0) return ret;
     9         if(sz == 1){
    10             str << nums[0];
    11             ret.push_back(str.str());
    12             return ret;
    13         }
    14         //str << nums[0];
    15         start = nums[0];
    16         for(int i = 1; i < sz; ++i){
    17             if(nums[i] == nums[i-1] + 1) continue;
    18             if(start != nums[i - 1])  //防止单个数字是一个区间的情况
    19                 str << start << "->" << nums[i - 1];
    20             else
    21                 str << start;
    22             ret.push_back(str.str());
    23             start = nums[i];
    24             str.str("");
    25         }
    26         if(nums[sz - 1] == nums[sz - 2] + 1){
    27             str << start << "->" << nums[sz - 1];
    28             ret.push_back(str.str());
    29         }else{
    30             str << nums[sz - 1];
    31             ret.push_back(str.str());
    32         }
    33         return ret;
    34     }
    35 };

     下面是用java写, 双指针, 比上面简单很多啊,代码如下:(注意,以后遇到双指针的问题,尽量不要用for循环,而应该使用while,自己移动指针,不容易出错(其实也是使用习惯问题))

     1 public class Solution {
     2     public List<String> summaryRanges(int[] nums) {
     3         List<String> ret = new ArrayList<String>();
     4         for(int p1 = 0, p2 = 0; p1 < nums.length; ++p1){
     5             while(p1+1 < nums.length && nums[p1+1] == nums[p1]+1)
     6                 p1++;
     7             if(p1 == p2)
     8                 ret.add(String.valueOf(nums[p1]));
     9             else
    10                 ret.add(String.valueOf(nums[p2]) + "->" + String.valueOf(nums[p1]));
    11             p2 = p1 + 1;//注意 ,这里p1不更新的原因是for循环还会为P1加上1, 当时没注意查了好久的bug 
    12         }      
    13         return ret;
    14     }
    15 }
  • 相关阅读:
    c# 运算符 ? ??
    c# linq <未完>
    javasript this
    python3 闭包(一)
    dom 中的换行符
    (转)关于 awk 的 pattern(模式)
    linux note(1)
    python sqlite3
    python 特殊方法
    Go Example--锁
  • 原文地址:https://www.cnblogs.com/-wang-cheng/p/4898723.html
Copyright © 2020-2023  润新知