题目:(来源于力扣)
思路:
1、将两个字符串num1,num2转化为number型,进行加法运算后再转为String
2、利用处理大整数的库BigInt
3、模拟两数相加的过程
代码:
第一种思路
var addStrings = function(num1, num2) {
let result1 = parseInt(num1)
let result2 = parseInt(num2)
return( result1+result2).toString();
}
提交后报错:
这是什么原因呢?
是因为js中的Number在 -2^53 + 1 到 2^53 - 1 范围内可以正常表示,但不在这是范围时会失真
而9333852702227987超出了范围
第二种思路
var addStrings = function(num1, num2) {
return (BigInt(num1) + BigInt(num2)).toString();
}
通过,但是题目中不允许用BigInt
第三种思路:
只需要对两个整数模拟加法的过程。借助双指针,定义两个指针 i 和 j 分别指向 num1和num2的末尾,同时定义一个变量 jw维护当前是否有进位,然后从末尾到开头逐位相加将结果追加到一个数组中,最后倒序再转字符串即可。
var addStrings = function(num1, num2) {
let i = num1.length -1;
let j = num2.length -1;
// 标志进位
let jw = 0;
let arr = [];
while(i>=0||j>=0||jw==1){
// 利用'-'运算符将num1和num2转化为数字
const top = num1.charAt(i) - 0;
const bottom = num2.charAt(j) - 0;
let result = top + bottom + jw;
// 将上下两位相加的结果与10比较,判断是否要进位
if(result >= 10){
arr.push(result - 10)
// 有进位
jw = 1;
}else{
arr.push(result);
// 没有进位
jw = 0;
}
i--;
j--;
}
// 将arr数组倒序后再转化为字符串
return arr.reverse().join('');
};
这里注意:while循环中要加入jw==1的情况,防止以下这种情况 result = 10,jw =1,但是由于 i 和j都小于0,所以不进入循环,结果只有0
你是不是迫不及待去一展拳脚啦~~~
题目链接:https://leetcode.cn/tag/string/problemset/ 里面的字符串相加