Count ones in a segment
This commit is contained in:
48
count-ones-in-a-segment/index.js
Normal file
48
count-ones-in-a-segment/index.js
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
// 0 0 0 0 0
|
||||||
|
// 1 0 0 0 1
|
||||||
|
// 2 0 0 1 0
|
||||||
|
// 3 0 0 1 1
|
||||||
|
// 4 0 1 0 0
|
||||||
|
// 5 0 1 0 1
|
||||||
|
// 6 0 1 1 0
|
||||||
|
// 7 0 1 1 1
|
||||||
|
// 8 1 0 0 0
|
||||||
|
// 9 1 0 0 1
|
||||||
|
// 10 1 0 1 0
|
||||||
|
// 11 1 0 1 1
|
||||||
|
// 12 1 1 0 0
|
||||||
|
// 13 1 1 0 1
|
||||||
|
// 14 1 1 1 0
|
||||||
|
// 15 1 1 1 1
|
||||||
|
|
||||||
|
|
||||||
|
// count column bits
|
||||||
|
function ccb(col, n) {
|
||||||
|
let div = (n + 1) / (2 << col);
|
||||||
|
let sum = Math.floor(div);
|
||||||
|
let rest = Math.max(0, (div - sum) * (2 << col) - (1 << col));
|
||||||
|
return sum * (1 << col) + rest;
|
||||||
|
}
|
||||||
|
|
||||||
|
// count all bits
|
||||||
|
function cab(n) {
|
||||||
|
// n < 1e9 => log2(1e9) ~= 30
|
||||||
|
let bits = 0;
|
||||||
|
for (let i = 0; i < 30; ++i) {
|
||||||
|
bits += ccb(i, n);
|
||||||
|
}
|
||||||
|
return bits;
|
||||||
|
}
|
||||||
|
|
||||||
|
// calc between range
|
||||||
|
function cbr(a, b) {
|
||||||
|
return cab(b) - cab(a-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// for (let i = 0; i < 16; ++i) {
|
||||||
|
// console.log(i, cab(i));
|
||||||
|
// }
|
||||||
|
|
||||||
|
function countOnes(left, right) {
|
||||||
|
return cbr(left, right);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user