1545. 找出第 N 个二进制字符串中的第 K 位-递归法

1545. 找出第 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:

输入:n = 3, k = 1
输出:“0”
解释:S3 为 “0111001”,其第 1 位为 “0” 。

示例 2:

输入:n = 4, k = 11
输出:“1”
解释:S4 为 “011100110110001”,其第 11 位为 “1” 。

示例 3:

输入:n = 1, k = 1
输出:“0”

示例 4:

输入:n = 2, k = 3
输出:“1”

对于这一题,我们就是对其进行还原嘛,不要去真的生成这个字符串,那样空间复杂度肯定通过不了
解题代码如下:

int mypow(int n){
    int re=1;
    for(int i=0;i<n;i++){
        re=re*2;
    }
    return re;

}
int knum;
char f(int n,int k){
    int num=mypow(n-1);
      if(k==1){
            return '0';
        }
       
      if(num==k){
        return '1';
    }
    else{
      
       if(n==2&&k==3){
            return '1';
        }
         if(k>num){
             knum++;
          return f(n-1,num*2-k);

          }
         else{
             return f(n-1,k);
           }

    }

   
  
}

char findKthBit(int n, int k){
      knum=0;
      
      char ch=f(n,k);
    
   
      if(knum%2==1){
          return (ch-'0'+1)%2+'0';
      }
      return ch;
      



}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值