已解答
简单
相关标签
相关企业
给定两个字符串形式的非负整数 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 <= 104
num1
和num2
都只包含数字0-9
num1
和num2
都不包含任何前导零
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:
# 取当前位的数字,如果越界则取0
n1 = int(num1[i]) if i >= 0 else 0
n2 = int(num2[j]) if j >= 0 else 0
# 计算当前位的和,加上进位
total = n1 + n2 + carry
result.append(str(total % 10)) # 取当前位的数字
carry = total // 10 # 更新进位
# 移动到前一位
i -= 1
j -= 1
# 结果数组是反向的,需要反转再拼接成字符串
return ''.join(result[::-1])
class Solution:
def addStrings(self, num1: str, num2: str) -> str:
res = "" # 存储结果的字符串
i, j, carry = len(num1) - 1, len(num2) - 1, 0 # 指针 i, j 分别指向 num1 和 num2 的末尾,carry 为进位
# 循环直到处理完所有位
while i >= 0 or j >= 0:
# 获取 num1 和 num2 当前位的数字,如果指针越界则取 0
n1 = int(num1[i]) if i >= 0 else 0
n2 = int(num2[j]) if j >= 0 else 0
# 计算当前位的总和(包括进位)
tmp = n1 + n2 + carry
carry = tmp // 10 # 更新进位,取 tmp 的十位
res = str(tmp % 10) + res # 当前位的值添加到结果最左侧
# 移动到前一位
i, j = i - 1, j - 1
# 如果最后还有进位,添加到结果最左侧
return "1" + res if carry else res
class Solution {
// 定义一个方法来实现字符串形式的大数相加
public String addStrings(String num1, String num2) {
// 创建一个StringBuilder用于存储结果,因为StringBuilder可变且支持反向操作
StringBuilder res = new StringBuilder("");
// i和j分别指向num1和num2的最后一个字符,用于从最低位开始逐位相加
int i = num1.length() - 1, j = num2.length() - 1;
// carry用于保存进位的值,初始为0
int carry = 0;
// 开始循环,当两个数字字符串中还有未处理的位或有进位时继续循环
while(i >= 0 || j >= 0) {
// 从num1和num2中分别提取当前位的值,超出边界则默认为0
int n1 = i >= 0 ? num1.charAt(i) - '0' : 0;
int n2 = j >= 0 ? num2.charAt(j) - '0' : 0;
// 将两位数的和加上进位
int tmp = n1 + n2 + carry;
// 更新进位值,若两位数之和为10或以上,进位为1,否则为0
carry = tmp / 10;
// 将结果的个位部分添加到StringBuilder中
res.append(tmp % 10);
// 向前移动一位
i--;
j--;
}
// 如果循环结束后仍有进位,则需要在结果中追加该进位
if(carry == 1) {
res.append(1);
}
// 结果需要反转,因为我们是从低位开始逐位相加
return res.reverse().toString();
}
}
详细注释说明:
- 方法定义:
public String addStrings(String num1, String num2)
:接收两个字符串参数,代表两个大整数。- 变量定义:
StringBuilder res
:用来存储结果的字符串构建器,以便快速添加和反转字符串。int i
、int j
:分别表示字符串num1
和num2
中当前位的位置,从最后一位(最低位)向前遍历。int carry
:表示进位,初始化为0。- 循环逻辑:
- 当
i >= 0
或j >= 0
时继续循环(即至少有一个字符串还未遍历完),且若仍有进位carry
,则继续循环。- 位值提取与计算:
n1
和n2
分别提取当前位值(若超出范围则默认为0)。tmp
:保存n1
、n2
和carry
的和。carry = tmp / 10
:更新进位值,若tmp
达到10或以上则产生进位。res.append(tmp % 10)
:将当前位的个位数(结果位)添加到res
中。- 处理剩余进位:循环结束后,若有
carry == 1
,需在res
中追加进位。- 反转结果:因结果是从低位开始构建,需反转后返回。