题目
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
分析
题目很简单,就是在原数组之上加一,但是要考虑的情况还是蛮多的,第一种情况是数组末尾数不为9,这种只需末尾数加一;第二种情况是数字末尾数为9但中间有不是9的数,eg:[1,2,3,9,9,9];第三种情况是数组数字均为9,eg:[9],[9,9,9]
解决方案
方法一:虽然代码更多但是比方法二更优化
注意一下,下面代码的执行用时:4ms,内存消耗:8.6MB;但是如果将for循环中的最后一个if语句去掉,换成注释中的if语句,同样可以运行,但执行用时变成了12ms,内存消耗变成了8.4MB。
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
int len=digits.size();
int i=len-1;
if(digits[len-1]==9&&len==1)//数组大小=1的特殊情况,[9]
{
digits[len-1]=0;
digits.insert(digits.begin(),1);
}
else if(digits[len-1]!=9)//数组大小>=1且数组最后一位不为9,比如[1],[1,2]
digits[i]+=1;
else//后面的数组大小均>=2
{
for(i;i>0;i--)//从后往前遍历
{
// if(digits[i]==9&&digits[i-1]==9&&i==1)//考虑[9,9,9]
// {
// digits[i]=0;
// digits[i-1]=0;
// digits.insert(digits.begin(),1);
// }
if(digits[i]==9&&digits[i-1]==9)//考虑[1,2,3,9,9,9]
digits[i]=0;
if(digits[i]==9&&digits[i-1]!=9)//考虑[1,2,3,9,9,9]
{
digits[i]=0;
digits[i-1]=digits[i-1]+1;
break;//不能掉,比如[1,2,3,9,9,9,3,9,9,9]
}
if(i==1)//考虑[9,9,9]
{
digits[i]=0;
digits[i-1]=0;
digits.insert(digits.begin(),1);
}
}
}
return digits;
}
};
方法二:
执行用时:8ms
内存消耗:8.6MB
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
int len=digits.size();
for(int i=len-1;i>=0;i--)//从后往前遍历
{
digits[i]+=1;
digits[i]%=10;
if(digits[i]!=0)
return digits;
}
digits.insert(digits.begin(),1);//解决像[9,9,9]这种情况,要扩充数组进一
return digits;
}
};