5484. 找出第 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 长度范围以内。
解法一:打表法 字符串最大长度为(1<<20 = 10^6)
class Solution {
string ans;
public:
Solution(){
ans = "0";
for(int i = 2; i<= 20;i++){
ans = ans + "1" + convert(ans);
}
}
//invert and reverse
static string convert(string& str){
int len = str.size();
// 这里一次性分配内存,因为每次追加会超出Time Limit
string result(len, '0');
for(int i = 0; i < len; i++){
if(str[i] == '0')
result[len - i - 1] = '1';
}
return result;
}
char findKthBit(int n, int k) {
return ans[k-1];
}
};
解法二: 递归
递归最大深度为n
class Solution {
public:
inline char invert(char ch){
return ch == '0' ? '1':'0';
}
// 递归深度,最大为n
char findKthBit(int n, int k) {
if(k == 1){
return '0';
}
int mid = 1<<(n-1);
if( k == mid){
return '1';
} else if(k < mid){
return findKthBit(n-1, k);
} else {
//以mid 为手性对称
return invert(findKthBit(n-1, 2 * mid - k));
}
}
};
网友评论