@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位的关系并不大。