leetcode 字符串相加

字符串相加

  1. 题目:给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
    你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

    示例 1:			
    输入: num1 = "2", num2 = "3"
    输出: "6"
    
  2. 思路:模拟双指针。我们定义两个指针 i 和 j 分别指向num1和 num2 的末尾,即最低位,同时定义一个变量 carry 维护当前是否有进位,然后从末尾到开头逐位相加即可。你可能会想两个数字位数不同怎么处理,这里我们统一在指针当前下标处于负数的时候返回 0,等价于对位数较短的数字进行了补零操作,这样就可以除去两个数字位数不同情况的处理。

  3. 代码:

    public String addStrings(String num1, String num2) {
            StringBuilder res = new StringBuilder("");
            int i = num1.length() - 1, j = num2.length() - 1, carry = 0;
            while(i >= 0 || j >= 0){
                int n1 = i >= 0 ? num1.charAt(i) - '0' : 0;
                int n2 = j >= 0 ? num2.charAt(j) - '0' : 0;
                int tmp = n1 + n2 + carry;
                carry = tmp / 10;
                res.append(tmp % 10);
                i--; 
                j--;
            }
            // 最后的进位不为零,单独处理
            if(carry == 1) res.append(1);
            // 逆输出正确的和
            return res.reverse().toString();
        }
    
  4. 复杂度分析
    时间复杂度 O(max(M,N))):其中 M,N 为数组数字长度,按位遍历一遍数字(以较长的数字为准);
    空间复杂度 O(1):指针与变量使用常数大小空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值