有一个变化规则,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);
}
答案 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
数为value
是0
1
的二进制表示中position
的数量为value
为1
这意味着
0001
,0010
,0100
,0111
包含奇数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
,这似乎是正确的。