Javascript 添加两个数字leetcode algo
我在做以下leetCode问题: 我不知道为什么我的一个测试用例失败了Javascript 添加两个数字leetcode algo,javascript,Javascript,我在做以下leetCode问题: 我不知道为什么我的一个测试用例失败了 [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] [5,6,4] 所以问题是 给您两个非空的链表,表示两个非负 整数。数字以相反的顺序存储,每个数字 节点包含一个数字。将这两个数字相加,并将其作为 链表 您可以假设这两个数字不包含任何前导零,除了 数字0本身 为此,我编写了以下算法 /** * Definition for singly-lin
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]
[5,6,4]
所以问题是
给您两个非空的链表,表示两个非负
整数。数字以相反的顺序存储,每个数字
节点包含一个数字。将这两个数字相加,并将其作为
链表
您可以假设这两个数字不包含任何前导零,除了
数字0本身
为此,我编写了以下算法
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
const makeLinkedList = (inArr, i) => {
if (i < 0) return null
return { val:inArr[i], next:makeLinkedList(inArr, i-1)}
}
var addTwoNumbers = function(l1, l2) {
let sum = 0
let i = 1
while(l1 || l2) {
if (l1 && l2) {
sum = sum + l1.val*i + l2.val*i
l1 = l1.next
l2 = l2.next
} else {
if (l1) {
sum = l1.val*i + sum
l1 = l1.next
}
if (l2) {
sum = l2.val*i + sum
l2 = l2.next
}
}
i = i*10
}
const sumToString = sum.toLocaleString('fullwide', {useGrouping:false});
return makeLinkedList(sumToString, sumToString.length-1)
};
i、 我的输出是[0,3,NaN,NaN,1]
而不是[6,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]
请注意,leetCode编译器将在输入时将数组转换为linkedlist。有人能帮我弄清楚为什么我的输入可能会失败吗 当JavaScript字符串化中的数字时,将有一个
+
符号表示正指数。您看到的序列是1E+30
,NaN
s代表+
和E
(由于还原顺序)。事实上,您可以放置一个console.log(sum)
或console.log(sumToString)
,然后在不知道这一点的情况下捕获问题,只需简单地查看问题所在
并非所有语言都会告诉您它们可以存储的最大值而不会降低精度,但JavaScript尤其会告诉您,它包含值9 007 199 254 740 991
,因此它比9E+15
,远小于1+1E+30
(较长的数字)
你需要做的是像你在小学学过的那样添加数字:添加两个数字,写一个数字,然后看看是否有一个1
带到下一个要添加的数字对
迭代版本:
函数makeLinkedList(arr,i){
i=i | | 0;
return iYou无法重新组合数字,使用parseInt
解析它们并将其拆分回去,因为JS没有任意精度的整数类型,因此即使您的代码是“正确的”,它也会在大于~2^53的数字上失败。其思想是,您需要添加每个位置,并在迭代这些列表时生成结果