JavaScript循环太慢

问题描述 投票:2回答:2

我正在执行代码战任务,无法理解如何使此函数在大数字<= 200000000000000时工作更快。该函数的目标非常简单-我只需要在二进制表示形式中计算所有'1'出现的次数“左”和“右”之间的数字(包括两者)。

function countOnes(left, right) {
var sum=0;
for (var i=left; i<=right; i++){
    var h=i.toString(2);
    var len=h.length;
    for (var j=0; j<len; j++){
        if (h[j]==1){sum++;}
    }
}
return sum;
}

提前感谢

javascript arrays largenumber
2个回答
1
投票
使用Bitwise运算符快一点:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators

->逻辑与->逻辑右移

function countOnesBin (left, right) { let sum = 0 for (let N=left; N<=right; N++) { let Bin = N for(let x = N.toString(2).length;x--;) { if ( Bin & 1 ) sum++ Bin = Bin >>1 } } return sum; }

as @ 

CodeBling认为这可能更好!

function countOnes_CodeBling (left, right) { let sum = 0 for (let N=left; N<=right; N++) { for(let Bin = N; Bin > 0; Bin = Bin >> 1) { if ( Bin & 1 ) sum++ } } return sum; }
这个,我不知道有没有可能:感谢@John

function countOnes_John (left, right) { let sum = 0 for (let V=left; V<=right; V++) { for (let N=V;N; N&=N-1) sum++ } return sum; }


0
投票
您可以避免使用拆分函数,并在总和中减去大减一的块数来进行第二次迭代:

function countOnes(left, right) { var sum=0; for (var i=left; i<=right; i++){ var h=i.toString(2); sum += h.split('1').length -1; } return sum; }

它仍然很慢,但是比原始代码快很多。
© www.soinside.com 2019 - 2024. All rights reserved.