从零学算法415

该文章介绍了一种解决字符串表示的非负整数相加问题的方法,不允许使用大整数库或直接转换。通过从字符串尾部遍历,逐位相加并处理进位,最终得到结果。官方题解提供了更简洁的实现,将进位和退出循环的条件结合在一起。
摘要由CSDN通过智能技术生成

415. 字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
示例 1:
输入:num1 = “11”, num2 = “123”
输出:“134”
示例 2:
输入:num1 = “456”, num2 = “77”
输出:“533”
示例 3:
输入:num1 = “0”, num2 = “0”
输出:“0”

  • 一开始我的想法是把两个数分别转为 long 类型,相加后再转成 String 即可。但是如果字符串长度过长,long 也不够用,所以只能原始人解法了。从尾部开始遍历两个字符串,遍历完了某个字符串则直接取另一个字符串的部分,否则取他们对应那一位的和,用一个变量判断是否需要进 1。遍历结束后再判断是否还有进的 1,有则加上即可。
  •   public String addStrings(String num1, String num2) {
          int i = num1.length()-1;
          int j = num2.length()-1;
           // 是否需要进 1
          boolean addMore = false;
          String ans = "";
          while(i>=0 || j>=0){
              int num;
              // num1 取完了就用 num2 
              // num2 取完了就用 num1
              // 否则用他们的当前位的和
              if(i<0 || j<0){
                  num = i<0?num2.charAt(j) - '0':num1.charAt(i) - '0';
              }else{
                  num = num1.charAt(i) - '0' + num2.charAt(j) - '0';
              }  
              // 之前的计算结果需要进 1 现在就加 1
              if(addMore){
                  num++;
              }
              if(num>9){
                  addMore=true;
                  num=num%10;
              }else{
                  addMore=false;
              }
              ans = num + ans;
              i--;
              j--;
          }
          // 最后还有没进的 1 就直接加在首位
          if(addMore){
              ans = 1 + ans;
          }
          return ans;
      }
    
  • 官方题解:需要进一的 1 其实就是 num/10,当前位无论如何加的也都是 num%10;i 小于 0 时取 num1 的部分为 0 即可,num2 同理;加完如果还需要进 1 的 1 也可以写在循环的条件中,加了这个 1 再退出循环, 所以可以再简化一下:
  •   public String addStrings(String num1, String num2) {
          int i = num1.length()-1;
          int j = num2.length()-1;
          int add = 0;
          String ans = "";
          while(i>=0 || j>=0 || add>0){
              int n1 = i<0?0:num1.charAt(i) - '0';
              int n2 = j<0?0:num2.charAt(j) - '0';
              int num = n1 + n2 +add;
              add = num/10;
              ans = num%10 + ans;
              i--;
              j--;
          }
          return ans;
      }
      
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值