Find Kth Bit in Nth Binary String - Bubble Down - O(log k) [JS]
Solution: Logic
Once we find the count of numbers on the same level as k, we can trace the digit down to the very first level (S1 = "0").
On every level, all indices revolve around the middle index, which is always "1".
For every level, reverse the current k into the first half of the sequence.
Keep track of how many times we have reversed k, as that determines how many inversions the digit has gone through.
Repeat this until we:
- Reach a middle digit (always guaranteed to be
"1") or - Reach the first level
At the end,
If the final k is a middle digit, return '0' if it should be inversed, otherwise '1'.
If the final k is 1, return '1' if it should be inversed, otherwise '0'.
Example: n = 4, k = 11 (k = 10 when 0-indexed)
0123456 7 8901234
0111001_1_0110001 (15)
1. | (k = 10)
2. | (k = 4)
3. | (k = 2)
4.| (k = 0)
We had 3 inversions, so we need to inverse '0' to '1'.
Time Complexity: O(log(k)) 0ms
Space Complexity: O(1) 48.1MB
function findKthBit(n, k) {
k--;
let levelCount = getLevelCount(k);
let inverse = false;
while (levelCount !== 1 && k !== Math.floor(levelCount / 2)) {
inverse = !inverse;
let half = Math.floor(levelCount / 2);
let distFromMid = k - half;
let inversedIndex = half - distFromMid;
k = inversedIndex;
levelCount = getLevelCount(k);
}
if (levelCount > 1 && k === Math.floor(levelCount / 2)) {
return inverse ? '0' : '1';
}
return inverse ? '1' : '0';
};
// Find the count of numbers on the same level as k
function getLevelCount(k) {
let count = 1;
while (count < k + 1) {
count = count * 2 + 1;
}
return count;
}
Comments
Post a Comment