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方式不够严谨,提交的时候遇到了两个错误
-
输入为空或只有一个数字的时候,没有进行判断,造成运行或输出错误
-
当输入的两个数字相差超过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]);