给定两个非负整数字符串 num1、num2,返回它们的和(字符串)。数字可能超大,不能直接 Number() 转换(会溢出 Number.MAX_SAFE_INTEGER)。
考点:模拟竖式加法(双指针从尾到头逐位相加 + 进位)。
var addStrings = function (num1, num2) {
let i = num1.length - 1, j = num2.length - 1, carry = 0
const res = []
while (i >= 0 || j >= 0 || carry) {
const n1 = i >= 0 ? num1.charCodeAt(i--) - 48 : 0 // -48 等价于 -'0'.charCodeAt(0)
const n2 = j >= 0 ? num2.charCodeAt(j--) - 48 : 0
const cur = n1 + n2 + carry
res.push(cur % 10) // 当前位
carry = (cur / 10) | 0 // 进位(位运算取整,比 Math.floor 快)
}
return res.reverse().join('')
}复杂度:时间 / 空间均 O(max(m, n))。
易错点:
- 循环条件别漏
|| carry,否则末尾还有进位时会少进一位(如"99" + "1"); - 短的字符串遍历完后补
0(i >= 0 ? ... : 0); charCodeAt - 48比Number(char)更省一次转换;- 别用
BigInt(num1) + BigInt(num2)投机,面试不认,逐位模拟才是考点。
关键套路一句话:字符串大数运算 = 双指针从尾向头、%10 取位、/10 进位、循环带上末尾进位。
举一反三:LeetCode Hot100 杂题 中的大数类题、字符串相乘(43)。