我正在执行代码战任务,无法理解如何使此函数在大数字<= 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;
}
提前感谢
->逻辑与->逻辑右移
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; }
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;
}
它仍然很慢,但是比原始代码快很多。