字符串相加(so )

86 阅读2分钟

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

现在是22:17。差一点就 生死时速。差一点与小熊锅锅擦肩而过。赶紧赶紧写一下!!!

题目:

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

 

示例:

示例 1:

输入:num1 = "11", num2 = "123" 输出:"134"

示例 2:

输入:num1 = "456", num2 = "77" 输出:"533"

示例 3:

输入:num1 = "0", num2 = "0" 输出:"0"

大家快来看,这道题好智障,1+1=2还要用算法。

不不不,是我眼瞎,是我格局小,是我没涨见识,是我心胸狭隘。

题目要求是字符串,不可以直接相加的,也不可以转化成整数之后再相加。那算了。

小学数学就知道做加法运算时要先从个位数字加起,如果超过十就进一。那大学算法也这样做吧,返璞归真。

最后一位字符的位置分别是nums1.length-1与nums2.length-1。

如何获取到呢,利用charAt()。charAt(nums1.length-1)就是“1234”中的“4”了,

隐式转换:“4”-0=4(string转化成number类型)

代码:

var addStrings = function (num1, num2) {
    let i = num1.length - 1
    let j = num2.length - 1
    let carry = 0  // 进位数,即留到下一轮相加的数
    let res = [] // 存放相加结果的个位数
    while (i >= 0 || j >= 0 || carry !== 0) {
        //  将v1 , v2 转为数值,其中一个数加完 <0 后赋值对应值为0,防止出错
        const v1 = i >= 0 ? num1.charAt(i) - '0' : 0
        const v2 = j >= 0 ? num2.charAt(j) - '0' : 0
        let val = v1 + v2 + carry
        res.unshift(val % 10)  // 将相加后的个位数放进数组,用unshift从头往前放,因为是从后往前相加的
        carry = Math.floor(val / 10)  // 相加后的十位数,留在下一次作为进位数一起进行相加
        // 两个指针继续往前走
        i--
        j--
    }
    return res.join('')
};

够500字了,周五潜水一下没什么毛病吧。yep!!!周五万岁!!!!