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

目录结构

1.题目

2.题解


1.题目

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

  • S_{1}="0" 
  • 当 i > 1 时,S_{i} = S_{i-1} + "1" + reverse(invert(S_{i-1}))

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

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

  • S_{1}="0"
  • S_{2}="011"
  • S_{3}="0111001"
  • S_{4}="011100110110001"

请你返回 S_{n}第 k 位字符 ,题目数据保证 k 一定在 S_{n} 长度范围以内。

示例:

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


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


输入:n = 1, k = 1
输出:"0"


输入:n = 2, k = 3
输出:"1"

提示:

  • 1 <= n <= 20
  • 1 <= k <= 2^n - 1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-kth-bit-in-nth-binary-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2.题解

注意到字符串的特点:前一个字符串中间位置的1,在下一个字符串的后半部分(以中间1为界分为前/后部分)对应位置变为0。因此关心的是K是否为中间位置。

二分查找+“递归”思想。

  • 当k在 S_{n} 中间位置mid,返回‘1’;
  • 当k在 S_{n} 后一半,使 K=K - mid 得到其在后一半的相对位置(即从mid+1开始),若此时K= mid / 2,即对应第 N -1个二进制字符串中的中间位置,由于翻转操作,故返回‘0’;
  • 否则,当k在 S_{n} 前一半,等价于求第 N -1个二进制字符串中的第 K 位。
public class Solution1545 {

    @Test
    public void test1545() {
        System.out.println(findKthBit(20, 1048575));
    }
    
    public char findKthBit(int n, int k) {
        int len = (int) Math.pow(2, n);
        while (n-- > 2) {
            int mid = len / 2;
            if (k == mid) {
                return '1';
            }
            if (k > mid) {
                k -= mid;
                if (k == mid / 2) {
                    return '0';
                }
            }
            len = mid;
        }
        return k == 1 ? '0' : '1';
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值