[LeetCode] 1545. Find Kth Bit in Nth Binary String

Given two positive integers n and k, the binary string Sn is formed as follows:
S1 = "0"
Si = Si - 1 + "1" + reverse(invert(Si - 1)) for i > 1
Where + denotes the concatenation operation, reverse(x) returns the reversed string x, and invert(x) inverts all the bits in x (0 changes to 1 and 1 changes to 0).

For example, the first four strings in the above sequence are:
S1 = "0"
S2 = "011"
S3 = "0111001"
S4 = "011100110110001"
Return the kth bit in Sn. It is guaranteed that k is valid for the given n.

Example 1:
Input: n = 3, k = 1
Output: "0"
Explanation: S3 is "0111001".
The 1st bit is "0".

Example 2:
Input: n = 4, k = 11
Output: "1"
Explanation: S4 is "011100110110001".
The 11th bit is "1".

Constraints:
1 <= n <= 20
1 <= k <= 2n - 1

找出第 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 长度范围以内。

思路

这道题的思路是递归。注意这个条件,当 i > 1 时,Si = Si-1 + "1" + reverse(invert(Si-1)),当前字符串 Si 是由 Si-1 得到的。因着这个规则,我们可以试图用递归做。

  • 如果 k 是中间那个 1,那么就返回 1
  • 如果 k 在左半边,那么就递归去找 Si - 1 的 k 位上的字符
  • 如果 k 在右半边,那么就递归去找 Si - 1,然后找到与 k 轴对称的那个 index,再做 invert 操作,是 0 则返回 1,是 1 则返回 0。

找与 k 轴对称的那个 index 的方法,自己需要演算一下。

复杂度

时间O(n) - 每次递归就找原长度的一半即可
空间O(n) - 栈空间

代码

Java实现

class Solution {
    public char findKthBit(int n, int k) {
		// 如果长度是1,那么就是S1
        if (n == 1) {
            return '0';
        }
		// 如果k恰好是中间那个digit,那么就是1
        int len = (int) Math.pow(2, n) - 1;
        if (k == (len + 1) / 2) {
            return '1';
        }
        // if at the first half
        if (k < (len + 1) / 2) {
            return findKthBit(n - 1, k);
        }
		// 如果k是右半边的digit,找到k在上一个字符串里的位置的reverse位置上的digit再返回他的invert的值
        return findKthBit(n - 1, len - k + 1) == '1' ? '0' : '1';
    }
}
posted @ 2024-10-20 03:03  CNoodle  阅读(11)  评论(0编辑  收藏  举报