【LeetCode】数组形式的整数加法

311 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

嗨!~ 大家好,我是YK菌 🐷 ,一个微系前端 ✨,喜欢分享自己学到的小知识 🏹,欢迎关注我呀 😘 ~ [微信号: yk2012yk2012,微信公众号:ykyk2012]

之前我们做了一题字符串相加,今天这题就是变成数组了,思想都是一样的,但是我们这里最后来一个巧妙的方法,看你能不能想到呢?

989. 数组形式的整数加法

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

链接:leetcode-cn.com/problems/ad…

【解法一】模拟加法

/**
 * @param {number[]} num
 * @param {number} k
 * @return {number[]}
 */
var addToArrayForm = function(num, k) {
    let result = []
    let len = num.length
    let add = 0
    for(let i = len - 1; i >= 0; i--){
        
        let sum = num[i] + k % 10 + add

        add = Math.floor(sum / 10)
        sum = sum % 10
        result[i] = sum
        k = Math.floor(k/10)
        
    }
    if(add === 1){
        result.unshift(1)
    }
    if(k > 0){
        if(add ===1){
            result.shift()  
            k = k + 1
        }
        while(k > 0){
            result.unshift(k % 10)
            k = Math.floor(k / 10)
        }
    }

    return result
};

在这里插入图片描述

之前我们也说过 push+reverse的操作要比unshift效率高~ 【LeetCode】字符串相加 - JavaScript的数组中unshift与push的效率对比

var addToArrayForm = function(num, k) {
    let result = []
    let len = num.length
    
    for(let i = len - 1; i >= 0; i--){
        let sum = num[i] + k % 10
        k = Math.floor(k/10)
        if(sum >= 10){
            k++
            sum -= 10
        }
        result.push(sum)
    }

    while(k > 0){
        result.push(k % 10)
        k = Math.floor(k/10)
    }

    result.reverse()

    return result
};

在这里插入图片描述

【解法二】巧妙解法

直接将数组中的数字加到k上来,然后将k的个位加到结果数组中

var addToArrayForm = function(num, k) {
    let result = []
    let len = num.length
    for(let i = len - 1; i >= 0 || k > 0; i--, k = Math.floor(k/10)){
        if(i >= 0){
            k += num[i]
        }
        result.push(k % 10)
    }
    result.reverse()
    return result
};

在这里插入图片描述