在做这道题时,自己的思路刚开始错误,一直解不出来,忽略了数组为全9的情况,之后看到一篇题解方法十分巧妙,在此记录一下。
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 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
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* plusOne(int* digits, int digitsSize, int* returnSize){
for(int i = digitsSize - 1; i >= 0; i--)
{
if(digits[i] + 1 == 10){
digits[i] = 0;
}
else{
digits[i] += 1;
*returnSize = digitsSize;
return digits;
}
}
*returnSize = digitsSize + 1;
int *temp = (int*)malloc(sizeof(int) * (digitsSize+1));
memset(temp, 0, sizeof(int) * (digitsSize+1));
temp[0] = 1;
return temp;
}
代码分为两部分,第一部分通过循环判断,如果需要进位,则将该位置置0,再次循环上一位,如果不需要进位,则加一return, 否则一直重复这种操作;
如果给定数组全为九,那么每一位都需要进位,所以就会执行到循环后面这一部分,即位数会多一位,所以返回的大小比原来大小多一,全九加一后除最高位全部为0,所以使用memset直接全部赋值为0,最后将最高位直接改为一。