查找 N 次迭代后获得的二进制字符串的第 k 个索引字符。在每次迭代中——“0”变成“10”,“1”变成“01”

Find k th index character of a binary string obtained after N iterations. In each iteration - '0' becomes '10' and '1' becomes '01'

我正在尝试为给定场景确定解决方案(最好在 JAVA 中):

输入:

每次迭代后,所有的1都变成“01”,0都变成“10” 例如

输出: N 次迭代后第 k 个索引处的值(0 或 1)。

经过N次迭代,每个原始数字变成2N个数字,所以跳过数字直到我们接近K。

例如对于输入 "1001"N=3K=20,第一个数字变成了 8 个数字,所以如果我们跳过这 8 个数字两次,即跳过 2 个原始数字 = 16 K,我们就在第3个原始数字(一个0),还有一个剩余的K=4.

然后我们对该数字应用迭代,得到 0 -> "10"。我们现在可以重新启动操作,输入 "10"N=2K=4.

重复直到完成。 O(N) 中的解决方案,无论输入长度或 K 的值如何。


当然,你可以直接暴力破解它,但在更高的值下效果不佳,因为解决方案是 O(L * 2N),其中 L 是输入长度。

// Brute-force solution
static char solve(String input, int n, int k) {
    String s = input;
    for (int i = 0; i < n; i++)
        s = s.chars().mapToObj(c -> c == '0' ? "10" : "01").collect(Collectors.joining());
    return s.charAt(k); // assuming k is 0-based
}

上述解决方案的精简版:

// Optimized solution
static char solve(String input, int n, int k) {
    for (; n > 0; k %= 1 << n--)
        input = input.charAt(k / (1 << n)) == '0' ? "10" : "01";
    return input.charAt(k);
}