题目:
给定一个表示 大整数 的整数数组 digits,其中 digits[i] 是整数的第 i 位数字。这些数字按从左到右,从最高位到最低位排列。这个大整数不包含任何前导 0。
将大整数加 1,并返回结果的数字数组。
示例 1:
输入: digits = [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
加 1 后得到 123 + 1 = 124。
因此,结果应该是 [1,2,4]。
示例 2:
输入: digits = [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
加 1 后得到 4321 + 1 = 4322。
因此,结果应该是 [4,3,2,2]。
示例 3:
输入: digits = [9]
输出: [1,0]
解释: 输入数组表示数字 9。
加 1 得到了 9 + 1 = 10。
因此,结果应该是 [1,0]。
提示:
1 <= digits.length <= 1000 <= digits[i] <= 9digits不包含任何前导0。
我的实现:
/**
* @param {number[]} digits
* @return {number[]}
*/
var plusOne = function(digits) {
let arr = (BigInt(digits.join('')) + BigInt(1)).toString().split('')
for(i = 0; i < arr.length; i++) {
arr[i] = Number(arr[i])
}
return arr
};
- 测试通过率100%
- 但是当我写完之后就在想,这能算是一个算法吗,确实不算,这只能算是一个工程实现
- 是一个有效的工程解决方案(适合实际开发),但作为算法练习,建议改用更底层的实现。算法题的核心价值在于训练基础逻辑能力,而非语言API的熟练度
- 这个算法的核心应该是想让我去模拟加法进位的过程
算法分析:
-
如果这个数字是1,那么+1就是2
-
如果这个数字是2,那么+1就是3
-
。。。。。
-
如果这个数字是8,那么+1就是9
-
如果这个数字是9,那么+1就是10,就相当于1 + 9 = 0,然后再拿进位的1去和前面相加
-
写成代码就是下面这样了
var plusOne = function(digits) { for(let i = 0; i < digits.length; i++) { if(digits[i] != 9) { ++digits[i] return digits } digits[i] = 0 } return [1, ...digits] }哈哈哈,标准的错误答案,加法是从最后一位开始算的,我为什么要从第一位开始呢,正确的是下面这样
var plusOne = function(digits) { for(let i = digits.length - 1; i >= 0; i--) { if(digits[i] != 9) { ++digits[i] return digits } digits[i] = 0 } return [1, ...digits] }
人菜又爱玩,希望能让我这生锈的脑子,再转动转动。。。