[java] LeetCode 415. Add Strings | 字符串相加

博客围绕LeetCode 415. Add Strings题目展开。解题不能直接将字符串转数字,需对字符操作,从最低位累加,用临时变量保存进位,特殊情况特殊处理,字符转int通过与‘0’作差。采用StringBuilder保存结果并反转,移动时对num2下标做判断。

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

题目描述

在这里插入图片描述

解题分析

题目要求不能直接把字符串转为数字,那么只能对其中的字符进行操作了,思路是分别从最低位开始累加,用临时变量保存进位,最后不能忘记对i==0时的特殊处理(若需要变长),字符转int的最简单的方式就是把char值与‘0’作差,这个偏移值就是目标值的大小。总体思路和之前的数组求和大同小异。其中采用StringBuilder来保存结果,最后需要反转。如果在移动过程中num2的下标小于0了,那么就不需要再加上它,这里是需要加上判断的。

代码实现

class Solution {
        public String addStrings(String num1, String num2) {

              if (num1.length()<num2.length()) {
                  String temp = num1;
                  num1 = num2;
                  num2 = temp;
              }
              int i = num1.length()-1;
              int temp=0;
              StringBuilder res = new StringBuilder();
              while (i>=0) {
                  if (i == 0) {
                      int sum = 0;
                      if (num1.length() == num2.length()) {
                          sum = num1.charAt(i) - '0' + num2.charAt(i) - '0' + temp;
                      } else {
                          sum = num1.charAt(i) - '0' + temp;
                      }
                      if (sum >= 10) {
                          res.append(sum % 10);
                          res.append(sum / 10);
                          break;
                      } else {

                      }
                  }

                  int a = num1.charAt(i) - '0';
                  int b = 0;
                  if (num2.length() - num1.length() + i >= 0) {
                      b = num2.charAt(num2.length() - num1.length() + i) - '0';
                  }
                  int sum = a + b + temp;
                  res.append(sum % 10);
                  temp = sum / 10;

                  i--;
              }
              if (res.equals("")) {
                  res = res.append("0");
              }
              return new String(res.reverse());
        }
}
<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、付费专栏及课程。

余额充值