题目描述
给定一个非空数组,表示一个非负整数,现在请将这个整数加1。
整数的所有数位从高到低存储在数组里,即整数的最高位存储在数组的第0个位置,并且数组里的每个元素只存储一位数字。
数据保证数组里不包含前导0(除了数组表示的数本身是0之外)。
样例1
输入:[1,2,3]
输出:[1,2,4]
解释:原数组表示的整数是123.
样例2
输入:[4,3,2,1]
输出:[4,3,2,2]
解释:原数组表示的整数是4321.
算法
(模拟) $O(n)$
模拟人工加法的过程。
从低位到高位,依次计算出每一位数字,过程中需要记录进位。
如果最高位进位是1,则需要将整个数组后移一位,并在第0个位置写上1。
时间复杂度分析:整个数组只遍历了一遍,所以时间复杂度是 $O(n)$。
C++ 代码
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
int t = 1;
for (int i = digits.size() - 1; i >= 0; i -- )
{
digits[i] += t;
t = digits[i] / 10;
digits[i] %= 10;
}
if (t)
{
digits.push_back(0);
for (int i = digits.size() - 2; i >= 0; i -- )
digits[i + 1] = digits[i];
digits[0] = 1;
}
return digits;
}
};
这个可删。不用平移了,因为只有999…这种变1000… 前半段code已经变成900…了,直接尾部加个0,第一位赋成1就得了。
为啥没用reverse呢?是这样效率更快吗?
下面那个向后移位的循环去掉也是可以的,也可以通过
我试了一下不可以。