Post Views:
324

其实这个应该是链表直接加就行了。。我开始想错了,然后搞笑的玩意来了。把我给气笑了。
测试用例有个
[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]
JS存的表示为

对于过长的数字,JS显示为1E+30.。。。牛逼。
function sumStrings(a,b){
var res='', c=0;
a = a.split('');
b = b.split('');
while (a.length || b.length || c){
c += ~~a.pop() + ~~b.pop();
res = c % 10 + res;
c = c>9;
}
return res.replace(/^0+/,'');
}
https://www.jianshu.com/p/c373943f0e9e js大数相加问题
JS处理大数相加,一般引用BigNumber.js。。查了下核心代码,加法的计算如下。
// adds two positive BigNumbers
BigNumber._add = function(a, b) {
var index;
var remainder = 0;
var length = Math.max(a.number.length, b.number.length);
for (index = 0; index < length || remainder > 0; index++) {
a.number[index] = (remainder += (a.number[index] || 0) + (b.number[index] || 0)) % 10;
remainder = Math.floor(remainder / 10);
}
return a.number;
};
a.number = [],是个数组 array : [3,2,1], [‘+’,3,2,1], [‘-‘,3,2,1]。所以说,我存储的结构必须改变为数组。
原来的思路PASS。
完成版本。。。效率惨不忍睹。
执行用时 :232 ms, 在所有 JavaScript 提交中击败了5.21%的用户
内存消耗 :44.5 MB, 在所有 JavaScript 提交中击败了8.82%的用户
随后我去掉了,console.log
执行用时 :132 ms, 在所有 JavaScript 提交中击败了70.70%的用户
内存消耗 :39.3 MB, 在所有 JavaScript 提交中击败了27.94%的用户
提升了一倍的速度。问题是怎么降低内存开销。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function(l1, l2) {
var numListA = [];
var numListB = [];
var resultArr = [];
getListNodeArr(numListA,l1);
getListNodeArr(numListB,l2);
console.log(numListA)
resultArr = add(numListA,numListB)
console.log(resultArr)
return array2ListNode(resultArr)
function array2ListNode(arr){
var line = arr.map((i,j)=>{
return new ListNode(i)
})
for(var j = 0;j<= line.length; j++){
line[j+1] && (line[j].next = line[j+1])
}
return line[0]
}
function getListNodeArr(listArr,listNode){
if(listNode.next!=null){
listArr.push(listNode.val)
getListNodeArr(listArr,listNode.next)
}else{
listArr.push(listNode.val)
}
}
function add(listA,listB){
var index;
var remainder = 0;
var length = Math.max(listA.length, listB.length);
for (index = 0; index < length || remainder > 0; index++) {
listA[index] = (remainder += (listA[index] || 0) + (listB[index] || 0)) % 10;
remainder = Math.floor(remainder / 10);
}
return listA;
}
};
好吧,看了官方解法。
很简单,逆序保证了,低位对齐。然后进一位,记录.
var addTwoNumbers = function(l1, l2) {
var result = temp = new ListNode(0)
while(l1 || l2){
var sum = (l1 && l1.val || 0) + (l2 && l2.val || 0) + ( temp.val || 0 )
var carry = parseInt(sum / 10)
l1 = l1 && l1.next
l2 = l2 && l2.next
temp.val = (sum % 10)
if(l1 || l2 ||carry){
temp.next = new ListNode(carry)
}
temp = temp.next
}
return result
};
貌似标准答案也没有快很多,空间占用也挺多的.
气死个人。。一晚上,没什么提速。感觉leetcode有问题。
C语言真的强。。算法是一样的。

惊了,java只要2ms,wtf
