Every day a leetcode
题目来源:66. 加一
解法1:模拟
使用一个add变量表示进位,add初始化为1。
从数组的末尾元素开始,每个元素加上add后判断:
- 若为个位数,说明没有产生进位,设add=0;
- 否则,该位模10,add=1。
最后,判断add是否为0:
- 若为0,说明无进位,直接返回digits;
- 若为1,说明还要进位,数组长度加1,则新建一个数组转储后返回。
代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* plusOne(int* digits, int digitsSize, int* returnSize){
int add=1;
for(int i=digitsSize-1;i>=0;i--)
{
digits[i]+=add;
if(digits[i]>9)
{
digits[i]%=10;
add=1;
}
else add=0;
}
if(add == 1)
{
*returnSize=digitsSize+1;
int *ans=malloc((digitsSize+1)*sizeof(int));
ans[0]=add;
for(int i=1;i<digitsSize+1;i++) ans[i]=digits[i-1];
return ans;
}
*returnSize=digitsSize;
return digits;
}
结果:
改进
当在某一位没有产生进位时,后面也不可能产生进位了,则当没有进位时,可以直接返回digits。
代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* plusOne(int* digits, int digitsSize, int* returnSize){
*returnSize=digitsSize;
int add=1;
for(int i=digitsSize-1;i>=0;i--)
{
digits[i]+=add;
if(digits[i]>9)
{
digits[i]%=10;
add=1;
}
else return digits;
}
if(add == 1)
{
*returnSize=digitsSize+1;
int *ans=malloc((digitsSize+1)*sizeof(int));
ans[0]=add;
for(int i=1;i<digitsSize+1;i++) ans[i]=digits[i-1];
return ans;
}
return digits;
}
结果: