模拟人工加法的思路
就像我们自己用笔在草稿纸上手动计算加法一样,从后往前加,一位一位地进行计算。
-
用循环遍历长度较长的字符串的同时,也可以遍历长度较短的数,在长度较短的数遍历完后,剩下的应该用0来代替计算。
-
如果当前位置的和
sum>10
,就说明有进位,用变量将进位保存,carry=1
,否则carry=0
。 -
在循环结束后,需要考虑第一个位置的加法有没有进位,若有进位,需要在前面拼接字符
'1'
。
代码实现
function solve( s , t ) {
if (!s || !t) {
return s || t || '';
}
let result = '';
let carry = 0; // 保存进位
let small = s; // 字符串长度短的数
let big = t; // 字符串长度长的数
if (s.length > t.length) {
small = t;
big = s;
}
// 两个字符串的长度差,主要用来索引长度短的字符串
const difference = big.length - small.length;
for (let i = big.length - 1; i >= 0; i--) {
let smallNum = parseInt(small[i-difference]);
(i - difference < 0) && (smallNum = 0); // 长度短的数不够位的话,用0来代替计算。
// 保存当前位置的和
const sum = parseInt(big[i]) + smallNum + carry;
if (sum > 9) {
// 和大于9,说明有进位,则当前位置的和为sum-10,并且保存进位数。
result = (sum - 10) + result;
carry = 1;
} else {
result = sum + result;
carry = 0;
}
}
// 最后的进位数也要算上
carry === 1 && (result = '1' + result);
return result;
}
时间复杂度:O(max(n,m))
,n为s.length
,m为t.length
,即长度较长的字符串决定时间复杂度。
空间复杂度:O(1)