zerolab-fe / one-question-per-day

每天一个小问题
21 stars 7 forks source link

加一 #19

Open GleanCoder1116 opened 4 years ago

GleanCoder1116 commented 4 years ago

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

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

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

示例1

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

JavaScript大家不容易关注的地方

输入: [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]

其实小于16位的数组处理很简单;复杂的就是超过16位的大数;Bigint;因为js本身的问题,想加会出异常

GleanCoder1116 commented 4 years ago

方法1

使用ES10新增API BigInt

const plusOne = (digits) =>  {
    // 数值6145390195186705544超出Number基本类型的容纳范围,改用BigInt基本类型
    let num = BigInt(digits.join(''));
    // BigInt基本类型进行数学操作时,需要在数字字面量后加个n
    let string = String(num + 1n);
    let ary = string.split('');

    return ary.map(str => Number(str));
};

方法2

首先用while遍历数组,只要数组从后往前有一个+1后不大于10,更改那位数组元素后,即可return digits,如果数组遍历完了还是没有return,那么就说明数组元素+1一直存在进位,则可以用js的splice添加首位元素并设值为1,最后修改新返回的数组的第二位为0,即可return digits


const plusOne = function(digits) {
    let i = digits.length - 1
    while(i>=0){
        if(digits[i] + 1 < 10){
            digits[i] = digits[i] + 1
            return digits
        }else{
            digits[i] = 0
        }
        i--
    }
    digits.splice(0,0,1)
    digits[1] = 0
    return digits
};