對稱美學,對稱字符串

時間限制:1s 空間限制:256MB 限定語言:不限

題目描述:

對稱就是最大的美學,現有一道關於對稱字符串的美學。已知:

第 1 個字符串:R

第 2 個字符串:BR

第 3 個字符串:RBBR

第 4 個字符串:BRRBRBBR

第 5 個字符串:RBBRBRRBBRRBRBBR

相信你已經發現規律了,沒錯!就是第 i 個字符串 = 第 i - 1 號字符串的取反 + 第 i - 1 號字符串;取反(R->B, B->R);

現在告訴你 n 和 k,讓你求得第 n 個字符串的第 k 個字符是多少。(k的編號從 0 開始)

輸入描述:

第一行輸入一個T,表示有T組用例;

接下里輸入T行,每行輸入兩個數字,表示n, k

1 <= T <= 100;

1 <= n <= 64;

 

 

0 <= k < 2^(n-1);

輸出描述:

輸出T行表示答案;

輸出 "blue" 表示字符是B;

輸出 "red" 表示字符是R;

補充說明:

輸出字符串區分大小寫,請注意輸出小寫字符串,不帶雙引號

示例1

輸入:

5

1 0

2 1

3 2

4 6

5 8

輸出:

red

red

blue

blue

blue

說明:

第 1 個字符串:R -> 第0個字符爲R

第 2 個字符串:BR -> 第1個字符爲R

第 3 個字符串:RBBR -> 第2個字符爲B

第 4 個字符串:BRRBRBBR -> 第6個字符爲B

第 5 個字符串:RBBRBRRBBRRBRBBR -> 第8個字符爲B

示例2

輸入:

1

64 73709551616

輸出:

red

 
function find(n, k) {
    if (n == 0) {
        return 'R';
    }
    let len = Math.pow(2, n);
    // 如果 k 在後半段,則與前一個字符串相同
    if (k >= len / 2) {
        let pos = k - len / 2;
        return find(n - 1, pos);
    } else {
        // 如果 k 在前半段,則與前一個字符串相反
        return find(n - 1, k) == 'R' ? 'B' : 'R';
    }
}

function main() {
    /*
    5 8
    n=5,k=8
    第 5 個字符串:RBBRBRRBBRRBRBBR  總字符串個數 2^(5-1) = 16,半數half=16/2=8;
    k=8 == half(8),說明第k=8個字符在後半部分,(從“第 1 個字符串:R  -> 第0個字符爲R ”,這句話可以看出,數字符串的時候是從0開始數,所以8在後半段了)
    這串字符是繼承的第4個字符串,沒有進行翻轉,且此字符在第4個字符串的位置爲 8 - half(8)=0;
    第 4 個字符串:BRRBRBBR   總字符串個數 2^(4-1) = 8,半數half=8/2=4;
    k=0<half(4),說明第k=0個字符在前半部分,這串字符是經過第3個翻轉的,則位置不變。
    第 3 個字符串:RBBR 總字符串個數  2^(3-1)=4,半數half=4/2=2;
    k=0<half(2),說明第k=0個字符在前半部分,這串字符是經過第2個翻轉的,則位置不變;
    第 2 個字符串:BR  總字符串個數  2^(2-1)=2,半數half=2/2=1;
    k=0<half(1),說明第k=0個字符在前半部分,這串字符是經過第1個翻轉的,則位置不變;
    第 1 個字符串:R  總字符串個數  2^(1-1)=1,到了第一個R。
    求出總共經過3次翻轉,R->B->R->B,得到結果爲blue
第 1 個字符串:R  -> 第0個字符爲R                   2^(1-1)=1,到了第一個R。         k = 0    1,k = 0 R
第 2 個字符串:BR  -> 第1個字符爲R                  2^(2-1)=2,半數half=2/2=1;     k = 1    2,k = 0 0在前半段,求 1,0 的反, B
第 3 個字符串:RBBR -> 第2個字符爲B                 2^(3-1)=4,半數half=4/2=2;     k = 2    3,k = 0 0在前半段,求 2,0 的反, R
第 4 個字符串:BRRBRBBR  -> 第6個字符爲B            2^(4-1)=8,半數half=8/2=4;     k = 6    4,k = 0 0在前半段,求 3,0 的反, B
第 5 個字符串:RBBRBRRBBRRBRBBR -> 第8個字符爲B     2^(5-1)=16,半數half=16/2=8;   k = 8  8在後半段,就求 4, 8-8 =》 4,0     B
                        如果 k 在後半段,則與前一個字符串相同, 如果 k 在前半段,則與前一個字符串相反
    */
    // n, k, 求第 n 個字符串的 第 k 個字符爲R 
    let res = find(n - 1, k) == 'R' ? "red" : "blue";
    console.log(res);
}

 

參考:https://www.nowcoder.com/discuss/443826793280278528

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章