加一
1. 题目描述
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位,数组中每个元素只存储单个数字。
可以假设除了0以外,这个整数不会以0开头。
示例
输入:[9,9]
输出:[1,0,0]
2. 解法
2.1 我的解法
我的想法是模拟人们计算加法的步骤。可以想象,加法是从低位开始,若有进位则逐渐向高位进位。因此我想从最后一位开始遍历数组,将其++判断是否有进位。如果没有进位,则该位++后直接输出数组为答案;否则则将该位置为0,再判断倒数第二位是否进位,以此类推。最后会存在一个问题,即全是9怎么办?这时候答案会比输入多一位,可以在原数组的第一位插入1。
class Solution {
public:
vector<int> plusOne(vector<int>& digits)
{
auto ref = --digits.rend();
//使用逆迭代器逆序遍历数组
for(auto it = digits.rbegin(); it!=digits.rend();)
{
if(++(*it) < 10)
{//如果不产生进位,直接输出
return digits;
}
else
{//产生进位,先将该位置0
*it = 0;
//判断这个位置是否位当前最高位
if(it == ref)
{//首位插入1,输出
digits.insert(digits.begin(),1);
return digits;
}
//向高位走,看看低位进位后高位是否会进位
++it;
}
}
//循环走完,最高位不进位
return digits;
}
};
2.2 寻找第一个不为9的数位
由于这个问题仅仅只是加一,因此我们只需要关注数组末尾有几个连续的9即可。这就是特殊情况。比如数组[1,2,3,9,9,9],我们只需要将倒数第四位3加1,再将末尾的9全部变为0就是我们的答案了。对于全是9的情况同样作为例外。
class Solution {
public:
vector<int> plusOne(vector<int>& digits)
{
//官方解法,寻找第一个不为9的数
for(auto rit = digits.rbegin(); rit != digits.rend(); ++rit)
{
if(*rit != 9)
{
*rit += 1;
for(auto rit1= digits.rbegin(); rit1 != rit; ++rit1)
{
*rit1 = 0;
}
return digits;
}
}
//走到这里说明数组全是9
for(auto it = digits.begin(); it != digits.end(); ++it)
{//将所有位置0
*it = 0;
}
//前面补上1
digits.insert(digits.begin(),1);
return digits;
}
};