javascript与leetcode——字符串相加
2018-03-20 15:58
615 查看
leetcode上有这样一道题目:
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
javascript:
这道题用js解答很简单,因为javascript中有很多隐式类型转换可以为我们所用,一下子就可以实现数值和字符串互换。(字符串直接转化为数字然后加起来简直作弊。)
举个例子:
这里通过隐式类型转换将a从字符串转为数值类型。
一开始我是把它们转换为数字进行计算的,出错了
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/30/99cd7eb75017e14e5237af69b87b5bea)
小的数字相加不会出错,到这种大的数字便出错了,很容易想到可能是跟数值数据类型存储的大小有关。
这里就得发问了,javascript的数值型数据类型一律存为double类型,整整8个字节,按照8个字节存储的话范围应该为:2.23x10^(-308) ~ 1.79x10^308
这么大的范围还不够存吗?
这里是个坑:对于整数的情况,js可以保证在53位的范围内能有正确的结果。这53位是一个安全的范围。
它存储的数值的范围在-2^63+1~2^63 - 1之间,即-9007199254740991~9007199254740991,超过这个范围js不保证数值的准确性。
为什么是53位?
具体原因点击:https://segmentfault.com/a/1190000002608050
解决办法:
不用数值类型存储,使用字符串类型存储,当然这要付出一点代价,使用字符串得读取字符串的每一位,还得处理进位
代码如下:
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
javascript:
这道题用js解答很简单,因为javascript中有很多隐式类型转换可以为我们所用,一下子就可以实现数值和字符串互换。(字符串直接转化为数字然后加起来简直作弊。)
举个例子:
var a="123456"; a=+a; // a=123456
这里通过隐式类型转换将a从字符串转为数值类型。
一开始我是把它们转换为数字进行计算的,出错了
小的数字相加不会出错,到这种大的数字便出错了,很容易想到可能是跟数值数据类型存储的大小有关。
这里就得发问了,javascript的数值型数据类型一律存为double类型,整整8个字节,按照8个字节存储的话范围应该为:2.23x10^(-308) ~ 1.79x10^308
这么大的范围还不够存吗?
这里是个坑:对于整数的情况,js可以保证在53位的范围内能有正确的结果。这53位是一个安全的范围。
它存储的数值的范围在-2^63+1~2^63 - 1之间,即-9007199254740991~9007199254740991,超过这个范围js不保证数值的准确性。
console.log(Number.MAX_SAFE_INTEGER); //9007199254740991 console.log(Number.MIN_SAFE_INTEGER); //-9007199254740991
为什么是53位?
具体原因点击:https://segmentfault.com/a/1190000002608050
解决办法:
不用数值类型存储,使用字符串类型存储,当然这要付出一点代价,使用字符串得读取字符串的每一位,还得处理进位
代码如下:
<!DOCTYPE html> <html> <body> </body> <script> /** * @param {string} num1 * @param {string} num2 * @return {string} */ var addStrings = function(num1, num2) { var len1=num1.length; var len2=num2.length; var sum='',val1,val2; var i=0,j=0; var inn=1; while(len1>0||len2>0) { val1=+(len1>0?num1[len1-1]:0); val2=+(len2>0?num2[len2-1]:0); i+=(val1+val2+j); j=0; while(i>=10) { i-=10; j++; } sum=i+''+sum;//直接使用字符串连接 i=0; inn*=10; len1--; len2--; } if(j>0) { sum=j+sum; } return sum;//为字符串类型 }; var num1="18582506933032752"; var num2="366213329703"; console.log(addStrings(num1,num2)); console.log(18582506933032752+366213329703); </script> </html>
相关文章推荐
- leetcode_415(两个数字字符串相加,模拟大数相加)
- javascript中加法操作符与减法操作符在字符串与数字相加时的区别
- LeetCode之二进制字符串相加
- javascript字符串拆分成单个字符相加和不超过10,求最终值第1/2页
- javascript如果数字和字符串相加会自动转换为字符串
- leetcode415---字符串大数相加
- [LeetCode] Add Strings 字符串相加
- 67.LeetCode Add Binary(easy)[字符串 大数相加处理]
- JavaScript中字符串相加性能
- JavaScript趣题:大整数字符串相加
- javascript 数字相加的时候要进行一下处理,不然就是字符串相加
- [LeetCode]—Add Binary 两个字符串二进制相加
- [LeetCode] 415. Add Strings 字符串相加
- codewars打怪升级日记 用JavaScript实现大数相加 /像数字一样加数字型字符串
- LeetCode425——Add Strings(两个字符串中的数字相加(十进制或二进制),输出字符串形式的结果)
- Javascript 笔记 字符串与数字相加
- LeetCode 02. 两数相加(链表) 03.最大不重复的字符串