题目描述:
给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组。最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 :
输入: [1,2,3] 输出: [1,2,4] 解释: 输入数组表示数字 123
输入: [4,3,2,1] 输出: [4,3,2,2] 解释: 输入数组表示数字 4321
输入: [1,9,8,9] 输出: [1,9,9,0] 解释: 输入数组表示数字 1989
方法分析:
看到这个题,我的第一反应是把输入的数组转换为数字,然后加一,再还原为数组,以下就是我之前的代码:
var plusOne = function(digits) {
var dig2intplus1 = 1+ +digits.join("");
var res2Arr = [...dig2intplus1.toString()]
return res2Arr.map((item) => +item)
};
抛开该代码来回的类型转换不说,其最大的问题就是js的精度问题。当数字超过 时,js的计算就会失真。
具体可查看知乎回答:https://www.zhihu.com/question/29010688
这条路走不通,只有换一条路走了。看来,我们就只有遍历数组了,倒序遍历数组,判断该位是否为9,如果不为9,将该位加1,然后结束迭代,返回结果即可;如果该位为9,将该位置0,并判断上一位是否为9,重复该操作即可。这里要注意,在结束迭代之后,如果数组首位为0,这时应该在数组开头加上1,比如输入[9,9,9]就应返回[1,0,0,0]。
代码如下。
代码实现:
var plusOne = function(digits) {
//倒序遍历数组
for (var i = digits.length - 1; i >= 0; i--) {
//判断该位是否为9,如果为9,则置0,否则正常加1并返回
if(digits[i] != 9 ){
++digits[i];
return digits;
}
digits[i] = 0;
}
//当数组首位为0时,在首位插入1
digits.unshift(1);
return digits;
};
代码解析:
这段代码的逻辑在方法分析中已经比较清晰的阐述过了,此处就不再赘述了。
该算法的时间复杂度为:O(n)
该算法的空间复杂度为:O(1)