66. 加一
题目描述: 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
直接对数组最后一个元素进行加一操作,判断特殊情况:最后一位是否为9,如果是9的话需要进位,前一位加1;循环计算前一位的数字,判断到第一位的时候,如果第一位大于9则在最前面再加一个数字
//C int* plusOne(int* digits, int digitsSize, int* returnSize){ int i; digits[digitsSize - 1] += 1; for(i = digitsSize - 1; i > 0; i--){ if(digits[i] >= 10) { digits[i] %= 10; digits[i - 1] += 1; } else break; } if(digits[0] >= 10) { digits[0] %= 10; *returnSize = digitsSize + 1; int *res = (int *)malloc(sizeof(int) * (*returnSize)); res[0] = 1; digits[0] = 0; for(i = 0; i < digitsSize; i++) res[i + 1] = digits[i]; return res; } else{ *returnSize = digitsSize; int *res = calloc(*returnSize, sizeof(int)); memcpy(res, digits, sizeof(int) * (*returnSize)); return res; } } //JS var plusOne = function(digits) { digits[digits.length - 1]++; for(var i = digits.length - 1; i > 0; i--){ if(digits[i] >= 10) { digits[i] %= 10; digits[i - 1] += 1; } else break; } if(i == 0 && digits[i] >= 10) { digits[i] %= 10; digits.unshift(1); } return digits; };
使用变量记录每个位置的进位
//C int* plusOne(int* digits, int digitsSize, int* returnSize){ int i, carry = 0; int *p = (int *)malloc(sizeof(int) * digitsSize); for(i = digitsSize - 1; i >= 0; i--){ p[i] = digits[i] + carry; if(i == digitsSize - 1) p[i] += 1; if(p[i] == 10) { p[i] = 0; carry = 1; } else carry = 0; } if(carry == 1) { *returnSize = digitsSize + 1; int *q = (int *)malloc(sizeof(int) * (*returnSize)); q[0] = 1; for(i = 0; i < digitsSize; i++) q[i + 1] = p[i]; return q; } else{ *returnSize = digitsSize; return p; } } //JS var plusOne = function(digits) { let tmp = 0; for(let i = digits.length - 1; i >= 0 ; i--) { digits[i] += tmp; if(i == digits.length - 1) digits[i]++; if(digits[i] >= 10) { digits[i] = 0; tmp = 1; } else { tmp = 0; } } if(tmp == 1){ digits.unshift(1); } return digits; };
JS里ES10中的新的基本类型BigInt,它可以兼容大数
//JS var plusOne = function(digits) { return (BigInt(digits.join('')) + 1n).toString().split('').map(Number); };