2021-06-11 日记 C++(三十)

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

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

你可以假设除了整数 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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值