LeetCode 题解工作台

字符串相加

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

category

3

题型

code_blocks

8

代码语言

hub

3

相关题

当前训练重点

简单 · 数学·string

bolt

答案摘要

我们用两个指针 和 分别指向两个字符串的末尾,从末尾开始逐位相加。每次取出对应位的数字 和 ,计算它们的和 $a + b + c$,其中 表示上一次相加的进位,最后将 $a + b + c$ 的个位数添加到追加到答案字符串的末尾,然后将 $a + b + c$ 的十位数作为进位 的值,循环此过程直至两个字符串的指针都已经指向了字符串的开头并且进位 的值为 。 最后将答案字符串反转并返回…

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 数学·string 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

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

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

 

示例 1:

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

示例 2:

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

示例 3:

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

 

 

提示:

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

解题思路

方法一:双指针

我们用两个指针 iijj 分别指向两个字符串的末尾,从末尾开始逐位相加。每次取出对应位的数字 aabb,计算它们的和 a+b+ca + b + c,其中 cc 表示上一次相加的进位,最后将 a+b+ca + b + c 的个位数添加到追加到答案字符串的末尾,然后将 a+b+ca + b + c 的十位数作为进位 cc 的值,循环此过程直至两个字符串的指针都已经指向了字符串的开头并且进位 cc 的值为 00

最后将答案字符串反转并返回即可。

时间复杂度 O(max(m,n))O(\max(m, n)),其中 mmnn 分别是两个字符串的长度。忽略答案字符串的空间消耗,空间复杂度 O(1)O(1)

以下代码还实现了字符串相减,参考 subStrings(num1, num2) 函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution:
    def addStrings(self, num1: str, num2: str) -> str:
        i, j = len(num1) - 1, len(num2) - 1
        ans = []
        c = 0
        while i >= 0 or j >= 0 or c:
            a = 0 if i < 0 else int(num1[i])
            b = 0 if j < 0 else int(num2[j])
            c, v = divmod(a + b + c, 10)
            ans.append(str(v))
            i, j = i - 1, j - 1
        return "".join(ans[::-1])

    def subStrings(self, num1: str, num2: str) -> str:
        m, n = len(num1), len(num2)
        neg = m < n or (m == n and num1 < num2)
        if neg:
            num1, num2 = num2, num1
        i, j = len(num1) - 1, len(num2) - 1
        ans = []
        c = 0
        while i >= 0:
            c = int(num1[i]) - c - (0 if j < 0 else int(num2[j]))
            ans.append(str((c + 10) % 10))
            c = 1 if c < 0 else 0
            i, j = i - 1, j - 1
        while len(ans) > 1 and ans[-1] == '0':
            ans.pop()
        if neg:
            ans.append('-')
        return ''.join(ans[::-1])
speed

复杂度分析

指标
时间Depends on the final approach
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    Tests your ability to simulate arithmetic operations without using built-in integer conversion.

  • question_mark

    Evaluates your understanding of string manipulation and handling of carries in addition.

  • question_mark

    Checks if you can handle edge cases like different string lengths and no leading zeros.

warning

常见陷阱

外企场景
  • error

    Failing to correctly handle carries, especially at the most significant digit.

  • error

    Not considering edge cases like one string being longer than the other.

  • error

    Incorrectly managing the case when the result has an additional carry at the end.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Add Strings for large numbers where the length of the strings exceeds typical integer limits.

  • arrow_right_alt

    Modify the problem to add multiple strings, not just two.

  • arrow_right_alt

    Optimize the solution to handle cases where both strings are of equal length.

help

常见问题

外企场景

字符串相加题解:数学·string | LeetCode #415 简单