LeetCode-415. 字符串相加

本文介绍了一种不使用BigInteger库或直接转换字符串为整数的算法,用于计算两个大数字符串的和。通过模拟人工加法过程,该算法有效地处理了大数运算,避免了常规整数类型可能引发的溢出问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

难度:简单

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

注意:

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

解题思路:

  1. 设定 i,j 两指针分别指向 num1,num2 尾部,模拟人工加法;

  2. 计算进位: 计算 carry = sum/10,代表当前位相加是否产生进位;

  3. 添加当前位: 计算 sum=sum + carry,并将当前位 sum% 10 添加至 StringBuilder尾部;

  4. 当遍历完 num1,num2 后跳出循环,并根据 carry 值决定是否在头部添加进位 1,最终翻转StringBuilder返回 即可。

代码实现:

public String addStrings(String num1, String num2) {
    int i = num1.length()-1;
    int j = num2.length()-1;
    int carry = 0;
    StringBuilder sb = new StringBuilder();
    int sum = 0;
    int res = 0;
    while(i>=0 || j>=0){
        if(i>=0){
            sum += num1.charAt(i)-'0';
        }
        if(j>=0){
            sum += num2.charAt(j)-'0';
        }
        sum = sum + carry;
        res = sum%10;
        carry = sum/10;
        sb.append(res);
        sum = 0;
        i--;
        j--;
    }
    if(carry>0){
        sb.append('1');
    }
    return sb.reverse().toString();
}

复杂度分析

  • 时间复杂度: O ( max ⁡ ( len 1 , len 2 ) ) O(\max(\textit{len}_1,\textit{len}_2)) O(max(len1,len2)),其中 len 1 = num1 . l e n g t h , len 2 = num2 . l e n g t h \textit{len}_1=\textit{num1}.length,\textit{len}_2=\textit{num2}.length len1=num1.lengthlen2=num2.length
  • 空间复杂度: O ( 1 ) O(1) O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值