解题思路 1
当对最后一个整数加一的时候,会有下面三种情况:
- 不需要进位
- 进位,但是数组长度不变
-
进位,数组长度改变
考虑到第三种情况,可以一开始就开辟+1个元素的数组。
int* retarr = (int*)malloc(sizeof(int)*(digitsSize+1));
-
通过遍历数组,因为+1会有进位的情况,所以需要构造一个循环,循环结束后会有i++,并且nextnum的值有0或者1的情况。
-
当nextnum的是0的时候,return的数组长度时i;当nextnum是1的时候,就需要额外开辟的空间放置进位,return的数组长度是i+1;
-
因为+1是从个位开始的,所以retarr现在的数是逆序的,最后需要转置一下再输出。
代码 1
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* plusOne(int* digits, int digitsSize, int* returnSize){
int* retarr = (int*)malloc(sizeof(int)*(digitsSize+1));
int i = 0, nextnum = 0;
while(i < digitsSize)
{
if(i==0)
retarr[i] = digits[digitsSize-1-i] + 1;
else
retarr[i] = digits[digitsSize-1-i] + nextnum;
if(retarr[i] > 9)
{
retarr[i] = 0;
nextnum = 1;
}
else
nextnum = 0;
i++;
}
if(nextnum == 1)
{
retarr[i] = nextnum;
*returnSize = i+1;
}
else
{
retarr[i] = 0;
*returnSize = i;
}
int left = 0, right = *returnSize-1;
while(left <= right)
{
int tmp = retarr[left];
retarr[left] = retarr[right];
retarr[right] = tmp;
left++;
right--;
}
return retarr;
}
解题思路 2
在第一种解题思路的基础上进行优化。
不需要对全部整数进行遍历,因为题目只是+1,所以没有进位的时候(可以假设除了整数 0 之外,这个整数不会以零开头),可以直接return了;有进位的时候,当前的数就置为0,因为不会返回就进入下一次循环,下一个数++。
如果遍历完所有的数都没有返回,说明还有一个进位 1, 同时其他所有的数都是 0。
代码 2
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
for(int i = digits.size()-1; i >= 0; i--)
{
digits[i]++;
digits[i] %= 10;
//没有进位 直接return
if(digits[i] != 0)
return digits;
}
vector<int> ret(digits.size()+1);
ret[0] = 1;
return ret;
}
};