题目要求
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
eg:
输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
解法一
刚开始我想的是先把数组中的数组转化为数字然后加一再转化为数组,在leetcode提交后发现有一个用例不用过,那就是数字太大时无法表示,所以我就想就对尾数进行加一,但是有个问题就是如果尾数是9还要进一,所以我写出了解法一。提交后虽然成功了,但是效率非常低,所以又有了解法二。
var plusOne = function (digits) {
var index = digits.length - 1
var num = digits[index]
var i = 0
// 全是9的情况
digits.map((item,index) => {
if(item === 9) {
i++
}
})
if(i === digits.length) {
digits.unshift(1)
digits.map((item,index) => {
if(item === 9) {
digits[index] = 0
}
})
return digits
}
// 尾数不是9时直接加一就行了
if (num !== 9) {
digits[index] = digits[index] + 1
console.log(digits);
return digits
}
var flag = true
while (flag) {
digits[index] = 0
if (digits[index - 1] === 9) {
// 判断前一位是否是9,是的话继续执行循环
index = index - 1
} else {
// 找到不是9的加一即可结束
digits[index - 1] = digits[index - 1] + 1
flag = false
}
}
return digits
};
解法二
在完成解法一的时候就可以发现这个是可以用递归完成的
var plusOne = function (digits) {
function isNine(index) {
if (index === 0 && digits[index] === 9) {
// 当遍历到第一位并且是9时,将第一位数设为0并插入一个1
digits[0] = 0
digits.unshift(1)
return
}
// 从尾部开始检查,如果是9则设为0并继续检查前一位
if (digits[index] === 9) {
digits[index] = 0
isNine(index - 1)
} else {
// 找到不是9的则加1然后结束
digits[index] = digits[index] + 1
return
}
}
isNine(digits.length - 1)
return digits
};