Skip to content

Commit 2f3c779

Browse files
committed
feat: 20260303 check in
1 parent 5b08b37 commit 2f3c779

1 file changed

Lines changed: 73 additions & 0 deletions

File tree

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
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

Comments
 (0)