算法修炼之路—【字符串】Leetcode 415 字符串相加

题目描述

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

注意:

  1. num1num2 的长度都小于5100;
  2. num1num2 都质保函数字0-9
  3. num1num2 都不包含任何前导零;
  4. 你不能使用任何BigInteger库,也不能直接将输入的字符转换为整数形式

思路分析

难度是简单 ,题目给出字符串均由数字字符组成,则我们只需要按倒序遍历即可,这里需要一点小知识就是ASCII码中的数字字符是紧邻并按大小顺序排列的且字符相减为ASCII的整型数值差,即'9'-'0' = 9

接收容器使用StringBuilder,数字相加的详细讲解可参见Leetcode 2 两数相加,这里直接给出完整代码:

解题代码

    public static String solution(String a, String b) {
        if(a == null || a.length() == 0) return b;
        if(b == null || b.length() == 0) return a;
        
        StringBuilder res = new StringBuilder();        
        int carry = 0;
        
        for(int i = a.length() - 1, j = b.length() - 1;
                i >=0 || j >= 0; i--, j--){
            
            int v1 = i >= 0 ? a.charAt(i) - '0': 0;
            int v2 = j >= 0 ? b.charAt(j) - '0' : 0;
            
            carry = (v1 + v2) / 10;
            res.append((v1 + v2) % 10);
        }
        
        res.append(carry == 1 ? '1' : "");
        return res.reverse().toString();
    }

复杂度分析

这里我们设m, n为输入字符串的长度;

时间复杂度: 我们对输入的字符串均进行了一次遍历,故时间复杂度为O(max(m, n));
空间复杂度: 我们使用了res存储了结果, 故空间复杂度为O(max(m, n));

Github源码

完整可运行文件请访问GitHub

©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值