加一
描述
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
思路
- 不同数组操作主要分为最后一位为9的和不为9的,若最后一位不为9,则最后一位加一输出即可
- 若最后一位为9,又可分为全为9和不全为9,全为9时数组大小加一,且除第一位为1外其他全为0
- 不全为9时,从后往前遍历数组,若为9则置为0,若不为9则加一直接返回
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* plusOne(int* digits, int digitsSize, int* returnSize){
int* result;
//最后一位不是9
if(digits[digitsSize - 1] != 9) {
result = (int*)malloc(sizeof(int)*digitsSize);
memcpy((void*)result,(void*)digits,sizeof(int)*digitsSize);
*returnSize = digitsSize;
result[digitsSize - 1] = digits[digitsSize - 1] + 1;
return result;
}
/*最后一位是9*/
for(int i=digitsSize - 1;;i--) {
if(digits[i] != 9)
break;
if(i == 0) {
//全都为9
*returnSize = digitsSize + 1;
result = (int*)malloc(sizeof(int)*(*returnSize));
result[0] = 1;
for(int j=1;j<*returnSize;j++)
result[j] = 0;
return result;
}
}
//不全为9
*returnSize = digitsSize;
result = (int*)malloc(sizeof(int)*(digitsSize));
int not_9_num = digitsSize - 1;
for(;not_9_num >= 0;not_9_num--) {
if(digits[not_9_num] != 9)
break;
result[not_9_num] = 0;
}
memcpy(result,digits,sizeof(int) * (not_9_num + 1));
result[not_9_num] = digits[not_9_num] + 1;
return result;
}