题目:

数组加一 点击跳转原页面

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

//示例一
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。

//示例二
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。

//验证示例:
[1,2,3] > [1,2,4]
[9] > [1,0]
[9,9,9] > [1,0,0,0]
[6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3] >
[6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,4]


解答:

错误方法: 看到这个题 第一反应都是 把数组变成数字 然后加一,接着把数字打散变回字符串

// 这个能解决大部分的问题, 但是digits.length 太大是 在转换成数字的时候会出现浮点数 导致结果不准
var plusOne = function(digits) {
    var countNum = Number(digits.join().replace(/\,/g,'')) + 1;
    var newArr = String(countNum).split('');
    newArr.map(function(v,i){newArr[i] = parseInt(v)});
    
    return newArr;
};

plusOne([1,2,3]) // [1,2,4] 
plusOne([6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3])  // [6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,0,0,0]

/*一直在检查编码哪算错了 
才发现是数值太大 转成了浮点数
Number("6145390195186705543")
"6145390195186705543"*1
parseInt("6145390195186705543")
以上3都会转换成:6145390195186705000
*/

正确方法:数组逐个数字的计算,一直递归上去

var plusOne = function(digits) {
    var locationNum = digits.length - 1; //初始化在最后一位
    function count_alone(index){
        // 处理数字少于9的 直接当前位置+1
        if(digits[index] < 9){ 
            digits[index] = digits[index]+1; 
            return digits;
        }else{
            //当前位置的值标记为0,位置-1继续递归
            digits[index] = 0;
            locationNum --;
            if(index == 0){
                digits.unshift(1);
            }else{
                count_alone(locationNum);
            }
        }
    }
    count_alone(locationNum);
    return digits;
};

mark一下 仅供参考 欢迎更正补充 end


Jerry
481 声望203 粉丝

学习的付出 从不欺人。记忆总是苦,写总结最牢固