415. 字符串相加
代码
ts
function addStrings(num1: string, num2: string): string {
let p1 = num1.length - 1, p2 = num2.length - 1;
const res = [];
let carry = 0;
while (p1 >= 0 || p2 >= 0 || carry > 0) {
const n1 = p1 >= 0 ? Number(num1[p1]) : 0;
const n2 = p2 >= 0 ? Number(num2[p2]) : 0;
const sum = n1 + n2 + carry;
carry = sum >= 10 ? 1 : 0;
res.push(sum % 10);
p1--;
p2--;
}
return res.reverse().join('')
};思路
模拟我们平时做加法的过程,从低位到高位逐位相加:
- 用
p1、p2分别指向num1、num2的末尾 - 用
carry记录进位 - 每次取当前位数字,如果某一方已经越界,就按
0处理 - 计算当前位和
sum = n1 + n2 + carry - 把
sum % 10加入结果数组,把新的进位更新为carry - 循环直到两个字符串都遍历完,并且没有进位
- 由于结果是从低位到高位加入的,最后需要反转再拼接成字符串
关键点
不能直接把整个字符串转成整数,因此要逐位模拟加法
越界位置按
0处理,可以统一逻辑循环条件里要保留
carry > 0,避免最后一位进位丢失时间复杂度
,其中 和 分别是两个字符串的长度 空间复杂度
,用于存储结果数组