簡體   English   中英

n次更改后找到第K個數字

[英]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

意思就是

0001001001000111中包含奇數個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM