2018-09-30-[leetcode(7)]加一  
View on GitHub wznonstop

2018-09-30-[leetcode(7)]加一

加一

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。 你可以假设除了整数 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了。