加一:
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
### 解题思路
执行用时:0 ms, 在所有 C 提交中击败了100.00%的用户
内存消耗:5.7 MB, 在所有 C 提交中击败了100.00%的用户
将最后一位增加1,判断其值是否为10(产生进位),继续判断倒数第二位加上进位1后是否为10,一直循环到数组第0位,如果其也等于0,那么就需要增加一位数组位,使用tag来标记是否有增加位数的进位,如9->10增加一位数组位。我这里直接让tag=0时为没有数组增位,为1时有数组增位,这样可以直接为数组动态分配(digitsSize+tag)个单位。然后根据tag的值来分两种情况把digits中的值转移到动态数组中即可
### 代码
```c
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* plusOne(int* digits, int digitsSize, int* returnSize){
*returnSize=digitsSize;
int i=digitsSize-1;
int tag=0;
digits[i]++;
while(digits[i]==10)
{
digits[i]=0;
if(i==0)
{
*returnSize+=1;
tag=1;
break;
}
digits[i-1]++;
i--;
}
int *ret=(int*)malloc(sizeof(int)*(digitsSize+tag));
if(tag==1)
{
ret[0]=1;
for(int j=0;j<digitsSize;j++)
ret[j+1]=digits[j];
}
else if(tag==0)
{
for(int j=0;j<digitsSize;j++)
ret[j]=digits[j];
}
return ret;
}
```