Skip to content

[leetcode]415.字符串相加 #31

Description

@MagicalBridge

[LeetCode] 415. Add Strings 字符串相加

给定两个字符串形式的非负整数 num1 和 num2,计算它们的和。

提示:

num1 和num2 的长度都小于 5100
num1 和num2 都只包含数字 0-9
num1 和num2 都不包含任何前导零
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式

方法一:模拟

思路与算法

本题我们只需要对两个大整数模拟 [竖式加法]的过程,竖式加法就是我们平时使用的对两个整数相加的方法,回想一下我们在纸上对两个整数相加的过程,是不是如下图将相同的数位对齐,从低位到高位逐位相加,如果当前位和超过10,则向高位进一位?因此我们只要将这个过程用代码写出来即可。

模拟竖式相加

具体实现也不复杂,我们定义两个指针 i 和 j 分别指向 nums1 和 nums2的末尾,即最低位,同时定义一个变量 add 维护当前是否有进位,然后从末尾到开头逐位相加即可,你可能会想两个数字位数不相同应该如何处理,这里我们统一在指针当前下标处于负数的时候返回0,等价于对位数较短的数字进行了补零操作,这样就可以除去两个数字位数不同情况的处理,具体看下面代码。

varaddStrings=function(num1,num2){leti=num1.length-1;// 最后一个索引letj=num2.length-1;letadd=0;// 返回的是数组constans=[];// 精髓就在这个while循环, 使用的是或while(i>=0||j>=0||add!=0){// 这部分涉及一个js的语法技巧,js 是弱类型的语言,如果两个数字型的字符相减// 或者其中一个为字符串时,那么会自动转换为 number类型进行运算// '1000' - '200' = 800;// 1000 - '800' = 200;// 1000 > '800' true// 所以下面这两句代码 �就是将当前的这个位置上的数字转换为 数字constx=i>=0 ? num1.charAt(i)-'0' : 0;consty=j>=0 ? num2.charAt(j)-'0' : 0;// 结果constresult=x+y+add;// 放进去的是对 10 取余的ans.push(result%10);// 0-9 和 0-9 相加 最大 就是 18 进制 只有可能是 add=Math.floor(result/10);i-=1;j-=1;}returnans.reverse().join('');}

复杂度分析

  • 时间复杂度: len1 = num1.length, len2 = num2.length. 竖式加法的次数取决于较大树的位数
  • 空间复杂度: O(1) 除答案外我们只需要常数空间存放若干变量。

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions