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 }

 

转载于:https://www.cnblogs.com/-wang-cheng/p/4898723.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值