给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 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 <= digits.length <= 100
0 <= digits[i] <= 9
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/plus-one
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
1、先理解一下数组表示十进制
[4,3,2]表示十进制的432
如果432+1,变成了433,那么数组就变成[4,3,3]
那如果产生进位呢?比如[3,9,9]+1
那么结果很明显是[4,0,0]
说是很容易,那么如何用代码实现呢?
2、首先十进制满10进1,并且题目只要求+1,也就是说不用考虑出现相加后超过10的情况,也就是说只有两种情况,第一:0~9无进位,第二:10产生进位
3、+1是加到个位上的,所以首先判断个位有没有产生进位,如果没有,那么后面也就不存在进位。所以在进行循环之前,首先对个位进行+1,并初始化进位标志carry=0
4、个位+1后进入循环,因为个位在数组的尾端,所以我们从a一直循环到0,表示从低位循环到高位。因为每次循环都要判断有没有产生进位,而这个判断主要是根据当前位数+进位标志是否=10的。我们把当前位数(从个位开始)和进位标志相加后的结果x对10取余后的结果,压入res数组,也就是到时候我们要提交的结果。
5、结果压完了,那么就是判断有没有产生进位了,进位就是看当前位数加上进位标志后是否等于10了,我们这里用x/10表示,如果是10,那么就会赋值1给carry,表示进位;其他的所有可能性都会赋值0给carry,表示没有进位。
6、循环结束后,判断carry是否还是1,如果是1,表示从个位数一路进位到最高位还有进位,那么就在res数组再添一个1。(如999+1,最后结果为000,carry为1)
7、到了最后,我们把res数组翻转,返回结果。(因为用push_back从数组尾端压入结果,所以不管结果如何,我们都要进行这一步翻转)
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
vector<int>res;
int carry=0;
int a=digits.size()-1;
digits[a]+=1;
while(a>=0)
{
int x=digits[a]+carry;
res.push_back(x%10);
carry=x/10;
a--;
}
if(carry!=0)res.push_back(carry);
reverse(res.begin(),res.end());
return res;
}
};