递归
假定当前查找的为第n层,我们要想知道第k位,可以向上一层n-1层查找对应元素。对于第n-1层,我们分三部分讨论,第n-1层中间位置为mid
①k<m,说明我们要找的元素也就是第n-1层中的第k个元素,直接向上查找第n-1层的第k个元素即可
②k>m,说明此时k为n-1层前半部分的第mid*2-k个位置旋转然后取反得到,此时向上查找第n-1层的第mid*2-k个元素,因为要取反,我们引入一个变量ans来记录取反的次数
③k==m,说明此时k由第n-1层正中间那个1变换而来,此时可直接返回结果,如果反转次数为偶数,则返回1;否则返回0。
class Solution {
public:
bool ans=0;
char findKthBit(int n, int k) {
if(n==1){
return ans?'1':'0';
}
int m=1<<n-1;
if(k<m) return findKthBit(n-1,k);
else if(k==m){
return ans?'0':'1';
}else{
ans=!ans;
return findKthBit(n-1,m*2-k);
}
}
};
时间复杂度:O(n)
空间复杂度:O(n)主要为递归的栈开销