Leecode加一算法与分析

@Leecode加一

本题是按简单tag顺序之中出现的第一个需要输出数组的题,话不多说,来看题干:

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
示例 1:

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

示例 2:

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

似乎平淡无奇的一道题,为什么要了小白笔者那么长的时间?并不是因为笔者歇笔两周多变菜了,而是因为其中的操作细节和对于堆溢出之后的处理确实需要注意,请看代码:

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
            int m=digits.size()-1;
            int n=digits.size()-1;
        while(m>=0&&(digits[m]+1)==10){
                digits[m]=0;
                m--;
            }
        if(m==-1){
            digits.push_back(1);
             for(int i=n;i>=0;i--){
                digits[i+1]=digits[i];
            }
            digits[0]=1;
        }  
        if(m>=0)
            digits[m]++;
         return digits;
    }
};

在这里插入图片描述
那么这样一份代码的思路其实一目了然。我们写着写着就会发现,如果给定的数字是9,19,29,99,999这样的数字,该怎么操作呢?[9]会变成[1,0],[1,9]会变成[2,0],[9,9]则会变成[1,0,0],在数位交界处的很多9会加一位,其他的判断则是在第一个不是9的数字上加一,9都变成0。

那么思路来了,第一种就是笔者的复杂思路,从最后一个开始判断,只要是9一律变0,一直判断到整个数组的首位,如果还是9,说明要加一位数了,否则判断到第一个不是9的数字进行加一就完事了;第二种方法就聪明多了,直接判断第一个不是9的数的位置,操作虽然类似,但省去了许多不需要的步骤在这里就不搬代码了。

咋一看这份代码写的十分常规,但其中有必须要注意的点:
首先,在写while的判断条件时,需注意要将m>=0的判断写在先,否则可能因为m已经等于-1而出现digits[-1]的堆溢出(数组越界)的情况;
其次,在将整个vector数组后移时,要先开辟一个空间,因为即使是vector类型,如果没有开辟新的空间,也和普通数组没有两样,所以digits.push_back(1)这句话就十分重要了,如果没有这句,你会发现自己一直在堆溢出,于是开始找寻代码的逻辑漏洞直到疯掉也找不到;
最后,要注意在执行判断后m分为的两种情况分别是-1与不是-1,即是否是在数位的分界处的判断,和0位的关系并不大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值