【每日算法】LeetCode 66 —— 加一(一百五十八)

题目内容

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例

示例 1:

输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。

示例 2:

输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。

示例 3:

输入:digits = [0]
输出:[1]

提示

1、1 <= digits.length <= 100
2、0 <= digits[i] <= 9

题解

本题可以根据模拟人工加法的过程来求解。

首先,由于人工加法中,先从个位开始相加,为了与我们的日常加法保持一致,我们需要将数组翻转,个位在前。

然后,依次相加,如果最后一位需要进位,继续在数组末尾进1。

最后,将数组再次翻转得出。

由于程序扫描一遍digits,因此时间复杂度为O(n).

具体请看代码。

代码

class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
//将原数组翻转,把个位放到开头
reverse(digits.begin(),digits.end());
int t = 1;
for(auto& x: digits){
t += x;//和就是进位加上数值
x = t % 10;//对应位的数值
t /= 10;//下一位的进位
}
if(t) digits.push_back(t);//最后看进位是否需要多一位
reverse(digits.begin(),digits.end());
return digits;
}
};
Author: Frederic Niu
Link: https://www.fredericniu.cn/2021/05/31/【每日算法】LeetCode-66-——-加一(一百五十八)/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
我的公众号