Article / 文章

LeetCode 第415题:字符串相加

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

📖 文章摘要

本文详细解析LeetCode第415题“字符串相加”,这是一道考察字符串处理和模拟加法运算的题目。文章提供了多种解法,包含C#、Python、C++三种语言实现,配有详细的分析和性能对比。适合初学者和面试准备者。

核心知识点: 字符串处理、模拟加法、进位处理
难度等级: 简单
推荐人群: 编程初学者、面试准备者

题目描述

给定两个字符串形式的非负整数 num1 和 num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger),也不能直接将输入的字符串转换为整数形式。

示例

示例 1:

输入:num1 = "11", num2 = "123"
输出:"134"

示例 2:

输入:num1 = "456", num2 = "77"
输出:"533"

示例 3:

输入:num1 = "0", num2 = "0"
输出:"0"

提示

  • 1 <= num1.length, num2.length <= 10⁴
  • num1 和 num2 都只包含数字 0-9
  • num1 和 num2 都不包含任何前导零

解题思路

方法一:模拟加法

这是最直观的解法,模拟我们手工计算加法的过程。

关键点:

  1. 从右向左遍历字符串
  2. 处理进位
  3. 注意字符和数字的转换
  4. 处理不等长字符串

具体步骤:

  1. 从最低位开始遍历两个字符串
  2. 计算当前位的和与进位
  3. 更新进位值
  4. 将结果转换为字符串

方法二:字符串反转法

通过反转字符串来简化处理过程。

关键点:

  1. 先反转字符串方便处理
  2. 统一处理长度不等的情况
  3. 最后再反转结果

图解思路

算法步骤分析表

步骤 操作 状态 说明
初始状态 - carry=0 初始化进位为0
计算个位 1+3 result=“4”,carry=0 计算最低位
计算十位 1+2 result=“34”,carry=0 计算次低位
计算百位 0+1 result=“134”,carry=0 计算最高位

状态/情况分析表

情况 输入 输出 说明
基本情况 “11”,“123” “134” 正常相加
不等长 “456”,“77” “533” 补零处理
有进位 “456”,“956” “1412” 需要处理进位
特殊情况 “0”,“0” “0” 都是零

代码实现

C# 实现

public class Solution {
    public string AddStrings(string num1, string num2) {
        int i = num1.Length - 1;
        int j = num2.Length - 1;
        int carry = 0;
        StringBuilder result = new StringBuilder();
        
        while (i >= 0 || j >= 0 || carry > 0) {
            int x = i >= 0 ? num1[i] - '0' : 0;
            int y = j >= 0 ? num2[j] - '0' : 0;
            int sum = x + y + carry;
            
            result.Insert(0, (sum % 10).ToString());
            carry = sum / 10;
            
            i--;
            j--;
        }
        
        return result.ToString();
    }
}

Python 实现

class Solution:
    def addStrings(self, num1: str, num2: str) -> str:
        i, j = len(num1) - 1, len(num2) - 1
        carry = 0
        result = []
        
        while i >= 0 or j >= 0 or carry:
            x = int(num1[i]) if i >= 0 else 0
            y = int(num2[j]) if j >= 0 else 0
            
            total = x + y + carry
            result.append(str(total % 10))
            carry = total // 10
            
            i -= 1
            j -= 1
            
        return ''.join(result[::-1])

C++ 实现

class Solution {
public:
    string addStrings(string num1, string num2) {
        int i = num1.length() - 1;
        int j = num2.length() - 1;
        int carry = 0;
        string result = "";
        
        while (i >= 0 || j >= 0 || carry > 0) {
            int x = i >= 0 ? num1[i] - '0' : 0;
            int y = j >= 0 ? num2[j] - '0' : 0;
            int sum = x + y + carry;
            
            result = to_string(sum % 10) + result;
            carry = sum / 10;
            
            i--;
            j--;
        }
        
        return result;
    }
};

执行结果

C# 实现

  • 执行用时:88 ms
  • 内存消耗:38.9 MB

Python 实现

  • 执行用时:36 ms
  • 内存消耗:15.2 MB

C++ 实现

  • 执行用时:0 ms
  • 内存消耗:6.7 MB

性能对比

语言 执行用时 内存消耗 特点
C++ 0 ms 6.7 MB 性能最优,内存占用最小
Python 36 ms 15.2 MB 代码简洁,性能适中
C# 88 ms 38.9 MB 实现清晰,内存占用较大

代码亮点

  1. 🎯 使用StringBuilder/vector优化字符串操作
  2. 💡 统一处理字符串长度不等的情况
  3. 🔍 优化进位处理逻辑
  4. 🎨 代码结构清晰,变量命名规范

常见错误分析

  1. 🚫 未处理进位
  2. 🚫 字符串索引越界
  3. 🚫 字符和数字转换错误
  4. 🚫 未考虑特殊情况(如“0”+“0”)

解法对比

解法 时间复杂度 空间复杂度 优点 缺点
模拟加法 O(max(n,m)) O(max(n,m)) 直观易懂 需要处理进位
字符串反转法 O(max(n,m)) O(max(n,m)) 代码简洁 需要额外空间

相关题目


📖 系列导航

🔥 算法专题合集 - 查看完整合集

📢 关注合集更新:点击上方合集链接,关注获取最新题解!目前已更新第415题。


💬 互动交流

感谢大家耐心阅读到这里!希望这篇题解能够帮助你更好地理解和掌握这道算法题。

如果这篇文章对你有帮助,请:

  • 👍 点个赞,让更多人看到这篇文章
  • 📁 收藏文章,方便后续查阅复习
  • 🔔 关注作者,获取更多高质量算法题解
  • 💭 评论区留言,分享你的解题思路或提出疑问

你的支持是我持续分享的动力!

💡 一起进步:算法学习路上不孤单,欢迎一起交流学习!