目录结构
1.题目
给你两个正整数 n 和 k,二进制字符串 的形成规则如下:
- 当 i > 1 时,
其中 + 表示串联操作,reverse(x) 返回反转 x 后得到的字符串,而 invert(x) 则会翻转 x 中的每一位(0 变为 1,而 1 变为 0)
例如,符合上述描述的序列的前 4 个字符串依次是:
请你返回 的 第 k 位字符 ,题目数据保证 k 一定在 长度范围以内。
示例:
入: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在 中间位置mid,返回‘1’;
- 当k在 后一半,使 K=K - mid 得到其在后一半的相对位置(即从mid+1开始),若此时K= mid / 2,即对应第 N -1个二进制字符串中的中间位置,由于翻转操作,故返回‘0’;
- 否则,当k在 前一半,等价于求第 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';
}
}
- 时间复杂度:
- 空间复杂度: