这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战
题目描述
提供一个由 正整数(大于等于0,小于等于9) 组成的数组(数组长度大于等于0,小于等于100),然后需要你给这个数组合成的整数加一,然后再返回加一后的数组。
举个例子:
数组: [1, 2, 3]
返回: [1, 2, 4] (数组组成的整数是123,加一后变成124,把整数拆开返回数组)
数组: [3, 9, 2]
返回: [3, 9, 3]
数组: [3, 9]
返回: [4, 0]
数组: [9]
返回: [1, 0]
思路分析
第一种方法
因为数组的长度有可能是很大的(小于等于100),超过了js的最大安全数,所以如果你想遍历数组把所有元素转成数字,然后再把数字加一后转回数组,这样是行不通的,数字精度会丢失。
所以最好是通过遍历数组然后通过判断后直接在数组中把元素加一,再返回该数组。(因为单个元素的最大是9)
然后这里需要注意数字9加一后是要往前进一位的。
所以我这里是使用while循环对数组遍历,从后面往前面遍历,如果当前遍历的元素是9,则把当前的元素置为0,然后继续遍历
如果下一位还是9,则把它继续置为0。直到有一位不是9的,把它加一,然后退出循环。
如果遍历到第一位的元素还是9的时候,则需要使用unshift方法把1插入。(因为9加1要进位)
然后退出循环。返回数组即可。
代码如下:
/**
* @param {number[]} digits
* @return {number[]}
*/
var plusOne = function (digits) {
let i = digits.length - 1
while (i >= 0) {
if (digits[i] === 9) {
digits[i] = 0
if (i === 0) {
digits.unshift(1)
break
}
} else {
digits[i] += 1
break
}
i--
}
return digits
};
第二种方法
第二种方法也是类似的做法,从后往前遍历,找到第一个不等于9的元素,则把当前元素加一,然后把处于该元素之后的元素都置为0(因为这些元素都是9)。
然后返回数组即可。
如果遍历结束后找不到有元素不等于9,则证明所有元素都等于9,需要新建个相同长度的数组,然后往里填充0。
最后把1插入到开头,返回该数组即可。
代码如下:
/**
* @param {number[]} digits
* @return {number[]}
*/
var plusOne = function (digits) {
const len = digits.length
let i = len - 1
while (i >= 0) {
if (digits[i] !== 9) {
++digits[i]
let j = i + 1
while (j < len) {
digits[j] = 0
j++
}
return digits
}
i--
}
const arr = new Array(len).fill(0)
arr.unshift(1)
return arr
};