1545. 找出第 N 个二进制字符串中的第 K 位
大约 3 分钟
---
1545. 找出第 N 个二进制字符串中的第 K 位
- 标签:递归、字符串、模拟
- 难度:中等
题目链接
题目大意
描述:定义一个字符串序列 ,其中:
- 。
- 对于 ,。
- :翻转每个字符(,)。
- :将字符串反转。
给定 和 (-based)。
要求:返回 中第 位的字符。
说明:
- 。
- 。
示例:
- 示例 1:
输入:n = 3, k = 1
输出:"0"
解释:S3 为 "0111001",其第 1 位为 "0" 。- 示例 2:
输入:n = 4, k = 11
输出:"1"
解释:S4 为 "011100110110001",其第 11 位为 "1" 。解题思路
思路 1:递归 + 分类讨论
1. 核心思想
的长度为 。其结构为:
记 ( 的长度)。 的长度为 。
对于第 位(-based):
- 如果 :中间位,结果为 。
- 如果 :在左半部分,递归到 中找第 位。
- 如果 :在右半部分,对应 中的第 位(反转后的映射),但需要翻转(因为经过了 )。
2. 具体步骤
第 1 步:基础情况 ,,返回 "0"。
第 2 步:计算 。
第 3 步:分类讨论:
- :返回
"1"。 - :递归 。
- :递归 ,然后翻转(,)。
3. 正确性证明
。
设 的长度为 。
右半部分 的第 位(-based)对应 的第 位取反。
所以 的第 位()对应 的索引为 = ,取反。
4. 举例说明
以 为例:
(,反转后还是 "1")
长度 ,:
- ,进入右半部分。
- 递归 ,找第 位。
- ,,。
- ,进入右半部分。
- 递归 ,找第 位。
- ,第 位为 。
- 回溯: 处翻转,。
- 处再翻转,。
结果第 位为 。
思路 1:代码
class Solution:
def findKthBit(self, n: int, k: int) -> str:
if n == 1:
return "0"
length = (1 << n) - 1 # 2^n - 1
mid = (length + 1) // 2 # 中间位置
if k == mid:
return "1"
elif k < mid:
return self.findKthBit(n - 1, k)
else:
# 右半部分:对应左半部分的对称位置取反
res = self.findKthBit(n - 1, length - k + 1)
return "1" if res == "0" else "0"思路 1:复杂度分析
- 时间复杂度:,每次递归 减 。
- 空间复杂度:,递归栈深度。
思路 2:迭代
也可以用迭代代替递归,从 开始向下直到 ,记录翻转次数。
class Solution:
def findKthBit(self, n: int, k: int) -> str:
flip = 0
while n > 1:
length = (1 << n) - 1
mid = (length + 1) // 2
if k == mid:
return "1" if flip % 2 == 0 else "0"
elif k > mid:
k = length - k + 1
flip += 1
n -= 1
return "0" if flip % 2 == 0 else "1"