n次更改后找到第K位数字

时间:2014-09-20 00:28:01

标签: java bit

有一个变化规则,0 - > 01,1 - > 10.例如,在更改之后,10为1001。

假设输入为0,在更改此规则后,什么是第K个数字?

我只能带着残酷的解决方案,如下所示。但是我相信存在更好的解决方案,任何人都可以想出一些新的想法吗?

public char lalala(int n, int k) {
    String str = "0";
    for (int i = 0; i < n; i++) {
        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < str.length; j++) {
            if (str.charAt(j) == '0') {
                sb.append("01");
            } else {
                sb.append("10");
            }
        }
        str = sb.toString();
    }
    return str.charAt(k);
}

1 个答案:

答案 0 :(得分:0)

所以你生成的字符串看起来像

0110100110010110....

现在让我们垂直写下这些数字,然后打印每个数字位置的二进制表示

value|position -> position binary
-----+---------------------------
0    | 0       -> 0000
1    | 1       -> 0001
1    | 2       -> 0010
0    | 3       -> 0011
1    | 4       -> 0100
0    | 5       -> 0101
0    | 6       -> 0110
1    | 7       -> 0111
.      .          ....
.      .          ....

如果你仔细看看,你会看到:

  • 如果1的二进制表示中的position数为value0
  • 如果1的二进制表示中position的数量为value1

这意味着

0001001001000111包含奇数1 将为1

换句话说,value等于 number of ones modulo 2

使用这个事实,您可以创建代码,将n转换为表示其二进制形式的字符串,将所有的字符串相加,并检查它是奇数还是偶数。

n转换为value的代码可能如下所示

public static int value(int n) {
    String binary = Integer.toBinaryString(n);
    return binary.chars().map(e -> e == '1' ? 1 : 0).sum() % 2;
}

(如果您不熟悉Java 8中引入的流,则会有更长的版本)

public static int value(Integer n) {
    String binary = Integer.toBinaryString(n);
    int count = 0;
    for (char ch : binary.toCharArray())
        if (ch == '1') count ++;
    return count % 2;
}

当你像

一样使用它时
for (int i = 0; i < 20; i++)
    System.out.print(value(i));

您将获得输出01101001100101101001,这似乎是正确的。