leetcode 5484 找出第 N 个二进制字符串中的第 K 位-递归

5484. 找出第 N 个二进制字符串中的第 K 位

给你两个正整数 n 和 k,二进制字符串 Sn 的形成规则如下:

S1 = "0"
当 i > 1 时,Si = Si-1 + "1" + reverse(invert(Si-1))
其中 + 表示串联操作,reverse(x) 返回反转 x 后得到的字符串,而 invert(x) 则会翻转 x 中的每一位(0 变为 1,而 1 变为 0)

例如,符合上述描述的序列的前 4 个字符串依次是:

S1 = "0"
S2 = "011"
S3 = "0111001"
S4 = "011100110110001"
请你返回 Sn 的 第 k 位字符 ,题目数据保证 k 一定在 Sn 长度范围以内。

解法一:打表法 字符串最大长度为(1<<20 = 10^6)

class Solution {
    string ans;
public:
    Solution(){
        ans = "0";
        for(int i = 2; i<= 20;i++){
            ans = ans + "1" + convert(ans);
        }
    }
    //invert and reverse
    static string convert(string& str){
        int len = str.size();
       // 这里一次性分配内存,因为每次追加会超出Time Limit
        string result(len, '0');
        for(int i = 0; i < len; i++){
            if(str[i] == '0')
              result[len - i - 1] = '1';
        }
        return result;
    }
    char findKthBit(int n, int k) {
        return ans[k-1];
    }
};

解法二: 递归
递归最大深度为n

class Solution {
public:
    inline char invert(char ch){
        return ch == '0' ? '1':'0';
    }
    // 递归深度,最大为n
    char findKthBit(int n, int k) {
        if(k == 1){
            return '0';
        }
        int mid = 1<<(n-1);
        if( k == mid){
            return '1';
        } else if(k < mid){
            return findKthBit(n-1, k);
        } else {
            //以mid 为手性对称
            return invert(findKthBit(n-1, 2 * mid - k));
        }
    }
};

你可能感兴趣的:(leetcode 5484 找出第 N 个二进制字符串中的第 K 位-递归)