leetcode之Add Strings(415)

本文介绍了一种不使用内置BigInteger库或直接转换字符串为整数的方法,来计算两个字符串形式的非负整数之和。通过逐位相加并处理进位,实现了长整数的加法运算。

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

题目:

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

注意:

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

python代码:

class Solution:
    def addStrings(self, num1, num2):
        res,c,r = '',0,0 #c表示进位,r表示本位的去除进位的和
        #此处主要是用0来填充,使得两个字符串长度相同,容易操作
        if len(num1) > len(num2):
            num2 = '0' * (len(num1)-len(num2)) + num2
        else:
            num1 = '0' * (len(num2)-len(num1)) + num1
        for i in range(len(num1)-1, 0, -1):
            sum = int(num1[i]) + int(num2[i]) + c
            r, c = sum % 10, sum // 10
            res = str(r) + res
        return str(int(num1[0]) + int(num2[0]) + c) + res

 

<think>好的,用户想了解LeetCode上大数相加问题的解法,特别是Python和Java的实现。首先,我需要确认题目具体是哪一个,通常大数相加可能指的是像“Add Strings”(LeetCode 415)这样的题目,要求处理两个表示非负整数的字符串,返回它们的和。 接下来,我得回忆一下这个问题的解决思路。大数相加不能用直接转换成整数的方法,因为可能会超出整型范围,所以需要用字符串逐位处理。通常的步骤是从两个字符串的末尾开始,逐位相加,记录进位,然后逆序得到结果。 对于Python实现,需要考虑如何遍历字符串,处理不同长度的情况,以及进位。可能需要用两个指针i和j分别从num1和num2的末尾开始移动,取出对应位的数字,加上进位,计算当前位的结果和新的进位。然后将结果逆序。需要注意的是,最后如果还有进位,要添加到结果中。 Java的实现思路类似,不过由于Java中字符串不可变,可能需要使用StringBuilder来高效地构建结果字符串。同样处理每一位相加和进位,最后反转字符串得到正确顺序。 然后,用户可能关心时间复杂度和空间复杂度,这里都是O(max(M,N)),其中M和N是两个输入字符串的长度。另外,如何处理前导零?比如输入是“0”和“0”,应该返回“0”而不是“00”,所以在最后可能需要检查结果是否为空,或者是否有前导零的情况。 还要考虑边界条件,例如其中一个字符串为空的情况,或者两个字符串长度差异很大的情况。比如num1有1000位,num2只有3位,这时候需要正确遍历到较长的那个字符串的所有位数。 此外,用户可能对优化方法感兴趣。比如,是否可以在处理过程中直接操作字符而不用转换成整数?比如用ord(c) - ord('0')来得到数字值。这样可以减少转换步骤,提高效率。 在代码实现中,需要注意循环的条件应该是i >=0 或者 j >=0 或者还有进位存在。这样即使两个字符串都处理完了,如果还有进位,也需要再循环一次。 对于Python,可以用一个列表来收集结果,最后反转并拼接成字符串。而Java使用StringBuilder的append方法,最后反转即可。 现在需要验证一下示例是否正确。例如,输入“123”和“456”,结果应该是“579”;输入“999”和“999”得到“1998”。测试这些情况是否能正确处理,包括进位的情况。 最后,总结问题解决的关键点,以及可能的常见错误,比如忘记处理最后的进位,或者反转顺序时出错。</think>### LeetCode大数相加问题解法 在LeetCode中,"大数相加"问题通常指处理两个用字符串表示的非负整数相加(如题目[415. Add Strings](https://leetcode.com/problems/add-strings/)),避免直接转换整数导致的溢出问题。 #### Python实现 ```python def addStrings(num1: str, num2: str) -> str: i, j = len(num1)-1, len(num2)-1 carry = 0 result = [] while i >= 0 or j >= 0 or carry > 0: n1 = int(num1[i]) if i >= 0 else 0 n2 = int(num2[j]) if j >= 0 else 0 total = n1 + n2 + carry carry = total // 10 result.append(str(total % 10)) i -= 1 j -= 1 return ''.join(reversed(result)) ``` #### Java实现 ```java public String addStrings(String num1, String num2) { StringBuilder sb = new StringBuilder(); int i = num1.length() - 1, j = num2.length() - 1; int carry = 0; while (i >= 0 || j >= 0 || carry > 0) { int n1 = (i >= 0) ? num1.charAt(i--) - '0' : 0; int n2 = (j >= 0) ? num2.charAt(j--) - '0' : 0; int sum = n1 + n2 + carry; carry = sum / 10; sb.append(sum % 10); } return sb.reverse().toString(); } ``` #### 关键点说明 1. **双指针反向遍历**:从字符串末尾开始逐位计算(模拟手工加法) 2. **进位处理**:通过`carry`变量记录进位值 3. **结果反转**:因为计算结果是从低位到高位存储的,最终需要反转字符串 4. **时间复杂度**:$O(\max(M,N))$,其中$M,N$为输入字符串长度[^1] #### 边界案例验证 - 输入`"0"`和`"0"` → 输出`"0"` - 输入`"999"`和`"999"` → 输出`"1998"` - 输入不同长度字符串(如`"123456"`和`"789"`)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值