Leetcode前端必会系列:字符串相加

62 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

引言

算法的技能对于程序员是百益而无一害,作为程序员无论是前端还是后端算法技能对于我们都是十分十分的重要,我将陆续整理并讲解前端程序员必须掌握的经典算法。

题目描述

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

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

示例 1:

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

示例 2:

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

示例 3:

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

分析

根据题目的分析,我们知道题目需要完成两个字符串加法的模拟操作,因此我们需要使用一个字符串数组保存结果,同时遍历两个字符串从末位开始相加。

  1. 两个字符串同时开始遍历,指针从最后开始向前走
  2. 两个字符下标元素的累加和然后保存
  3. 使用临时标记每次累加是否进位1,并更新
  4. 将最后的结果返回

解答

   var addStrings = function(num1, num2) {

      let jin = 0

      let min = Math.min(num1.length,num2.length)

      let res = []

      for(let i=0;i<min;i++) {

        let sum = jin + Number(num1[num1.length-1-i]) +  Number(num2[num2.length-1-i])

        if(sum>=10) {

          sum -= 10

          jin = 1

        }else jin = 0

        res.unshift(sum)

      }

      if(min===num1.length) {

        //num2继续

        let begin = num2.length-min-1

        while(begin>=0) {

          let sum = jin + Number(num2[begin])

          if(sum>=10) {

            sum-=10;jin=1;

          }else jin = 0

          res.unshift(sum)

          begin--

        }

      }

      if(min===num2.length) {

        //num1继续

        let begin = num1.length-min-1

        while(begin>=0) {

          let sum = jin + Number(num1[begin])

          if(sum>=10) {

            sum-=10;jin=1;

          }else jin = 0

          res.unshift(sum)

          begin--

        }

      }

      if(jin===1) res.unshift(1)

      if(res[0]==='0') return "0"

      return res.join("")

    };

由于设计是字符串数组数据结构,通过分析知:算法的时间复杂度是o(n)。空间复杂度是o(n)。整体设计思路还是比较简洁容易的。

总结

通过对字符串相加的讲解,大家学到了进行问题的解决。通过for循环巧妙计算可以优雅的在低时间和空间复杂度下完成任务。