美文网首页
leetcode 5484 找出第 N 个二进制字符串中的第 K

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

作者: ColdRomantic | 来源:发表于2020-08-09 22:39 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/dfwrdktx.html