Find Kth Bit in Nth Binary String
MediumStringRecursionSimulation
Solution
Solution1: Brute Force
function findKthBit(n: number, k: number): string {
let s = '0';
for (let i = 1; i < n; i++) {
if (k <= s.length) break;
s += '1' + reverse(invert(s));
}
return s[k - 1];
}
function invert(s: string) {
return [...s].map((bit) => (bit === '0' ? '1' : '0')).join('');
}
function reverse(s: string) {
return [...s].reverse().join('');
}
Complexity
- Time:
O(2^N)
- Space:
O(2^N)
Solution2: Recursion
function findKthBit(n: number, k: number): string {
if (n === 1) {
return '0';
}
const length = 1 << n;
if (k < Math.floor(length / 2)) {
return findKthBit(n - 1, k);
}
if (k === Math.floor(length / 2)) {
return '1';
}
return findKthBit(n - 1, length - k) === '0' ? '1' : '0';
}
Complexity
- Time:
O(N)
- Space:
O(N)
Solution3: Divide & Conquer
export function findKthBit(n: number, k: number): string {
let invertCount = 0;
let totalLength = (1 << n) - 1;
while (1 < k) {
const mid = Math.floor(totalLength / 2);
if (k === mid + 1) {
return invertCount % 2 === 0 ? '1' : '0';
}
if (k > mid) {
k = totalLength + 1 - k;
invertCount += 1;
}
totalLength = Math.floor(totalLength / 2);
}
return invertCount % 2 === 0 ? '0' : '1';
}
Complexity
- Time:
O(N)
- Space:
O(1)