leetcode.989. 数组形式的整数加法

137 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

题目描述

整数数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 num = 1231,那么其数组形式为 [1,2,3,1]。 给定非负整数 num 的数组形式 A,返回整数 num+K 的数组形式。

第一次尝试

这道题读完题的瞬间我想到的就是将数组形式的A转换回整数形式的num再直接与k进行加法运算,再转换回数组形式。这是一种十分直接的方式。

在将数组转为数字的时候遇到了一点问题,JS的内置函数其实十分多了,很多转换直接使用内置函数就能完成。但是转换数字的过程中需要将数字中间的去掉,试验的时候发现replace(",", "")只能替换掉第一个逗号。于是就搜索各种试错后发现了正则表达式的强大。

let reg = new RegExp(",", "g");
let num2 = parseInt(num.toString().replace(reg, ""));
let res = num2 + k
return res.toString().split("")

代码很简洁,也能通过一部分用例。但是却不是全部,仔细审题后发现有条件—— 1 <= num.length <= 10000,这就代表着会有越界的情况,我的这种解法就是没有考虑到这种情况。

image.png

第二次尝试

上一种思路行不通就只能寻找其他的解决办法,这种方法就很巧妙:通过K来逐位与数组相加。例如k与数组最后一位相加,再取余就可以得到结果的尾数。这样一次相加就可以得到结果,而且不用考虑进位,因为进位自动在K中体现了。最后注意将数组取反就可以啦。

代码如下:

代码

var addToArrayForm = function(num, k) {
    let res = []
    let len = num.length - 1
    while(len >= 0 || k > 0) {
        if(len >= 0) {
            k += num[len]
            len--
        }
        res.push(k % 10)
        k = parseInt(k / 10)
    }
    return res.reverse()
};

后记

这种方式的复杂度相对较高,也不是最优解,有时间的时候还是要追求下最优解。