|
| 1 | +# [1545. 找出第 N 个二进制字符串中的第 K 位](https://leetcode.cn/problems/find-kth-bit-in-nth-binary-string/description/) |
| 2 | + |
| 3 | +> **日期**:2026-03-03 |
| 4 | +> **所用时间**:2min |
| 5 | +> **知识点**:递归、模拟 |
| 6 | +
|
| 7 | +## 1. 题目描述 |
| 8 | + |
| 9 | +给定两个正整数 `n` 和 `k`。按如下规则生成二进制字符串序列 $S_1, S_2, \ldots, S_n$: |
| 10 | + |
| 11 | +- $S_1 = \texttt{"0"}$ |
| 12 | +- 对 $i > 1$:$S_i = S_{i-1} + \texttt{"1"} + \text{reverse}(\text{invert}(S_{i-1}))$ |
| 13 | + |
| 14 | +其中 $+$ 表示拼接,$\text{reverse}(x)$ 表示将字符串 $x$ 反转,$\text{invert}(x)$ 表示将 $x$ 中每一位取反(0→1,1→0)。 |
| 15 | + |
| 16 | +请返回 **$S_n$ 中第 $k$ 位字符**(从左到右,从 1 开始计数)。返回字符 `'0'` 或 `'1'`。 |
| 17 | + |
| 18 | +**前几项示例:** |
| 19 | + |
| 20 | +- $S_1 = \texttt{"0"}$ |
| 21 | +- $S_2 = \texttt{"0"} + \texttt{"1"} + \texttt{"1"} = \texttt{"011"}$ |
| 22 | +- $S_3 = \texttt{"011"} + \texttt{"1"} + \texttt{"100"} = \texttt{"0111001"}$ |
| 23 | +- $S_4 = \texttt{"0111001"} + \texttt{"1"} + \texttt{"0110001"} 的反转取反部分 = \texttt{"011100110110001"}$(长度 $2^4-1=15$) |
| 24 | + |
| 25 | +**示例 1:** |
| 26 | + |
| 27 | +- **输入**:n = 3, k = 1 |
| 28 | +- **输出**:"0" |
| 29 | +- **解释**:$S_3 = \texttt{"0111001"}$,第 1 位为 `'0'`。 |
| 30 | + |
| 31 | +**示例 2:** |
| 32 | + |
| 33 | +- **输入**:n = 4, k = 11 |
| 34 | +- **输出**:"1" |
| 35 | +- **解释**:$S_4$ 的第 11 位为 `'1'`。 |
| 36 | + |
| 37 | +**约束:** |
| 38 | + |
| 39 | +- $1 \le n \le 20$ |
| 40 | +- $1 \le k \le 2^n - 1$ |
| 41 | + |
| 42 | +--- |
| 43 | + |
| 44 | +## 2. 递归 |
| 45 | + |
| 46 | +**思路:** |
| 47 | + |
| 48 | +$S_n$ 的长度为 $2^n - 1$,结构为:**前半段** = $S_{n-1}$,**中间一位** = `'1'`,**后半段** = $\text{reverse}(\text{invert}(S_{n-1}))$。中间位置为 $2^{n-1} = \texttt{1 << (n-1)}$。 |
| 49 | + |
| 50 | +- 若 `n == 1`:$S_1 = \texttt{"0"}$,直接返回 `'0'`。 |
| 51 | +- 若 `k == 2^(n-1)`:正好在中间,返回 `'1'`。 |
| 52 | +- 若 `k < 2^(n-1)`:在第 $n$ 层的前半段,即 $S_{n-1}$ 的第 $k$ 位,递归 `findKthBit(n-1, k)`。 |
| 53 | +- 若 `k > 2^(n-1)`:在后半段。后半段是「先对 $S_{n-1}$ 取反再反转」,因此从右往左数第 $(2^n - k)$ 位对应 $S_{n-1}$ 中从左往右第 $(2^n - k)$ 位取反。递归 `findKthBit(n-1, (1<<n) - k)` 得到该位在 $S_{n-1}$ 中的值,再取反返回。 |
| 54 | + |
| 55 | +**复杂度分析:** |
| 56 | + |
| 57 | +- 时间复杂度:$O(n)$(递归深度为 $n$,每层 $O(1)$) |
| 58 | +- 空间复杂度:$O(n)$(递归栈) |
| 59 | + |
| 60 | +**Python3** |
| 61 | + |
| 62 | +```python |
| 63 | +class Solution: |
| 64 | + def findKthBit(self, n: int, k: int) -> str: |
| 65 | + if n == 1: |
| 66 | + return '0' |
| 67 | + if k == 1 << (n - 1): |
| 68 | + return '1' |
| 69 | + if k < 1 << (n - 1): |
| 70 | + return self.findKthBit(n - 1, k) |
| 71 | + res = self.findKthBit(n - 1, (1 << n) - k) |
| 72 | + return '0' if res == '1' else '1' |
| 73 | +``` |
0 commit comments