[英]Find Kth digit number after n changes
有一個更改規則,即0-> 01、1->10。例如,更改后,10為1001。
假設輸入為0,則在此規則的n次更改之后,第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);
}
所以您生成的字符串看起來像
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
. . ....
. . ....
如果您仔細觀察,您將看到:
position
二進制表示形式中的數字1
為偶數,則value
0
position
二進制表示形式中的數字1
為奇數,則value
1
意思就是
0001
, 0010
, 0100
, 0111
中包含奇數個1
值將是1
。
換句話說, value
等於2
number of ones
模數 。
利用這個事實,您可以創建代碼,將n
轉換為代表其二進制形式的字符串,將所有的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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.