加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。
示例:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
实现:
/**
* @param {number[]} digits
* @return {number[]}
*/
var plusOne = function(digits) {
const len = digits.length;
if (len < Number.MAX_SAFE_INTEGER.toString().length) {
const nums = parseInt(digits.join(''), 10);
if (nums.isNaN) {
return new Error('type error');
} else {
digits = (nums + 1 + '').split('');
}
return digits.map(Number);
} else if (digits.indexOf(9) === -1) {
const lastNum = digits[len-1] + 1;
digits.splice(len-1, 1, lastNum);
return digits;
}
digits.reverse();
let flag = false;
for (let i = 0; i < len; i++) {
let curFlag = false;
const item = digits[i];
if (item === 9) {
if (i === 0 || flag) {
curFlag = true;
if (i === len-1) {
digits.splice(i, 1, 0, 1)
} else {
digits.splice(i, 1, 0)
}
}
} else if (flag || i === 0) {
digits.splice(i, 1, item+1)
}
flag = curFlag;
}
return digits.reverse();
};
解题过程中遇到了一个问题,假设一个数组arr = [6, 1, 4, 5, 3, 9, 0, 1, 9, 5, 1, 8, 6, 7, 0, 5, 5, 4, 3],这时候,parseInt(arr.join(‘’), 10) 会输出 6145390195186705000, 最后三位的数字会丢失,因为它大于JavaScript中可以安全递增的最大可能整数:Number.MAX_SAFE_INTEGER = 2^53-1 = 9007199254740991,至于为什么是这个数,后面我准备写一篇文章详细说明一下。 因为发现了这个问题,所以就在算法里做了判断,较小的数直接加1就可以,大数先判断最后一位是不是9,不是9的话,最后一位数直接加1就可以,是9的话就做一个标示,去看倒数第二位数; 如果倒数第二位数是9,那么加上最后一位数的进1,倒数第二位数就应该是0,同时再做一个标示;不是9,则加1就可以。以此类推,直到第一位数,如果第一位数不是9,同样,如果后面的数有进1,加1就可以, 没有则直接返回,如果第一位数为9,后面的数有进1,第一位数就变成10了。