LeetCode-228-汇总区间

LeetCode-228-汇总区间

题目

给定一个无重复元素的有序整数数组,返回数组区间范围的汇总。

示例 1:

输入: [0,1,2,4,5,7] 输出: ["0->2","4->5","7"] 解释: 0,1,2 可组成一个连续的区间; 4,5 可组成一个连续的区间。

示例 2:

输入: [0,2,3,4,6,8,9] 输出: ["0","2->4","6","8->9"] 解释: 2,3,4 可组成一个连续的区间; 8,9 可组成一个连续的区间。

 

思路

首先判断数组中数字与前一个数字的差值,如果为1表示连续,不为1则不连续

记数组中第一位数字为头,开始遍历数组

判断当前数字是否连续,连续则继续往下,不连续则记录头和当前数字,并把头更新为当前数字

 

总结

题目本身不难,但是由于code方式不够严谨,提交的时候遇到了两个错误

  1. 输入为空或只有一个数字的时候,没有进行判断,造成运行或输出错误

  2. 当输入的两个数字相差超过Int表示范围的时候,会出现运行错误

第一个问题很好解决,加上判断条件就可以了

第二个问题可以把思路中求当前数字与前一个数字的差值改为:当前数字减1是否为上一个数字即可

最后结果:

执行用时 :0 ms, 在所有 cpp 提交中击败了100.00%的用户

内存消耗 :8.5 MB, 在所有 cpp 提交中击败了59.48%的用户,

开心:)

 

代码

#include <iostream>
#include <vector>
#include <cstring>
#include <sstream>

using namespace std;

class Solution{
public:
string convertToString(int numA, int numB){
stringstream sstream;
if (numA!=numB){
sstream<<numA<<"->"<<numB;
}else{
sstream<<numA;
}
return sstream.str();
}

vector<string> summaryRanges(vector<int>& nums){
vector<string> result;
if (nums.size()==0){
return result;
}else if(nums.size()==1){
result.push_back(convertToString(nums[0], nums[0]));
return result;
}
int head = nums[0];
for (int i=1; i<nums.size(); i++){
string info = "";
if (nums[i]-1!=nums[i-1]){
info = convertToString(head, nums[i-1]);
result.push_back(info);
head = nums[i];
}
if (i==nums.size()-1){
info = convertToString(head, nums[i]);
result.push_back(info);
}
}
return result;
}

};

 

posted @ 2019-11-11 22:10  樱花小猪  阅读(508)  评论(0编辑  收藏  举报