“0”变为“10”,“1”变为“01”

ktca8awb  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(647)

我正在尝试为给定场景确定一个解决方案(最好是java):
输入:
二进制字符串:例如“1001”
n—迭代次数
k-字符串索引位置
每次迭代后,所有的1变为“01”,0变为“10”。
初始值/输入-->“1001”
第1次迭代后-->“0110101”
第二次迭代后-->“1001011001101001”
...
...
在第n次迭代之后-->“100101011……[kth index value]……00101010111..”(在这里,我们的程序需要找到第k个索引值,即0或1)
输出:n次迭代后第k个索引处的值(0或1)。

twh00eeo

twh00eeo1#

在n次迭代之后,每个原始数字变成2n个数字,所以跳过数字直到接近k。
e、 g.输入 "1001" , N=3 , K=20 ,第1个数字变成8个数字,所以如果我们跳过这8个数字两次,即跳过2个原始数字=16 k,我们就到了第3个原始数字(a) 0 ),还有一个 K=4 .
然后我们对这个数字进行迭代,得到 0 -> "10" . 我们现在可以用输入重新启动操作 "10" , N=2 , K=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);
}

相关问题