解决递归问题

1545. 找出第 N 个二进制字符串中的第 K 位 - 力扣(LeetCode)

题意:

$S_1$=“0”

$S_i=S_{i-1}+$ “1” $+reverse(invert(S_{i-1}))$

给定$n,k$,求$S_n$的第$k$个字符是$0$还是$1$

思路:

可以观察得到$S_n+1$的长度是一个首项为$2$,公比为$2$的等比数列

因此有$|S_n| = 2^{n}-1$

又因为$S_n$是由$S_{n-1}$,1,以及倒转的且每位翻转的$S_{n-1}$组成

所以$k< 2^{n-1} -1$ , 要找$S_{n-1}$的第$k$个字符

$k=2^{n-1}-1$ ,答案为$1$

$k>2^{n-1}-1$ ,要找$S_{n-1}$的第$2^{n}-k$个字符,并将其翻转转

basecase:n=1时,答案为$0$

class Solution {
public:
    char findKthBit(int n, int k) {
        if(n==1){
            return '0';
        }
        if(k==(1ll<<n-1)){
            return '1';
        }
        if(k<(1ll<<n-1)){
            return findKthBit(n-1,k);
        }
        return findKthBit(n-1,(1ll<<n)-k)^1;
    }
};