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';
}
}
标签:Binary,1545,reverse,invert,Si,Sn,字符串,S1,String
From: https://www.cnblogs.com/cnoodle/p/18486891