LeetCode 415 Add Strings

本文介绍了一种解决两个以字符串形式表示的大整数相加的方法。通过逐位相加并处理进位的方式,实现了一个高效的算法。文章提供了两种实现方案,一种是原始的详细实现过程,另一种则是经过优化后的简洁版本。

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

Problem:

Given two non-negative numbers num1 and num2 represented as string, return the sum of num1 and num2.

  1. The length of both num1 and num2 is < 5100.
  2. Both num1 and num2 contains only digits 0-9.
  3. Both num1 and num2 does not contain any leading zero.
  4. You must not use any built-in BigInteger library or convert the inputs to integer directly.

Summary:

以字符串的形式求两个整形数相加。

Analysis:

这道题是一道常规题,并不难,只需一位一位相加,注意在有进位的时候加上进位即可。

 1 class Solution {
 2 public:
 3     string addStrings(string num1, string num2) {
 4         int len1 = num1.size(), len2 = num2.size();
 5         int i = len1 - 1, j = len2 - 1, k = 0, carry = 0;
 6         char res[5200];
 7         
 8         while (i >= 0 && j >= 0) {
 9             int sum = num1[i] + num2[j] - 2 * '0' + carry;
10             if (sum > 9) {
11                 sum -= 10;
12                 carry = 1;
13             }
14             else {
15                 carry = 0;
16             }
17             
18             res[k++] = sum + '0';
19             i--; j--;
20         }
21         
22         while (i >= 0) {
23             int sum = num1[i] + carry - '0';
24             if (sum > 9) {
25                 sum -= 10;
26                 carry = 1;
27             }
28             else {
29                 carry = 0;
30             }
31             
32             res[k++] = sum + '0';
33             i--;
34         }
35         
36         while (j >= 0) {
37             int sum = num2[j] + carry - '0';
38             if (sum > 9) {
39                 sum -= 10;
40                 carry = 1;
41             }
42             else {
43                 carry = 0;
44             }
45             
46             res[k++] = sum + '0';
47             j--;
48         }
49         
50         if (carry) {
51             res[k++] = '1';
52         }
53         
54         res[k++] = '\0';
55         
56         for (i = 0; i < k / 2; i++) {
57             char tmp = res[i];
58             res[i] = res[k - i - 2];
59             res[k - i - 2] = tmp;
60         }
61         
62         string resStr = string(res);
63         
64         return resStr;
65     }
66 };

以上为我写的原始代码,代码过于冗长,下面是参考网上大牛的代码后优化的代码,代码简介了很多:

 1 class Solution {
 2 public:
 3     string addStrings(string num1, string num2) {
 4         int len1 = num1.size(), len2 = num2.size();
 5         int i = len1 - 1, j = len2 - 1, carry = 0;
 6         string res = "";
 7         
 8         while (i >= 0 || j >= 0) {
 9             int sum1 = i >= 0 ? num1[i--] - '0' : 0;
10             int sum2 = j >= 0 ? num2[j--] - '0' : 0;
11             
12             int sum = sum1 + sum2 + carry;
13             res.insert(res.begin(), sum % 10 + '0');
14             carry = sum / 10;
15         }
16         
17         return carry ? "1" + res : res;
18     }
19 };

 

转载于:https://www.cnblogs.com/VickyWang/p/6014656.html

<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、付费专栏及课程。

余额充值