题目链接:1545.找出第N个二进制字符串的第K位
题意:
给定一个规则:
S1 = "0"
- 当
i > 1
时,Si = Si-1 + "1" + reverse(invert(Si-1))
所以当n = 1 时, S = "0"
当n = 2 时,S = "011"
当n = 3 时,S = "0111001"
当n = 4 时, S = "011100110110001"
依次类推
解题思路
我们会发现字符串长度会随着n的次方增长,所以存储字符串是不明智的,会超出内存限制。所以需要找规律
如果 k 为中间的数字,那么那个数字是1.
如果 k 为后半部分的数字,那么他就是前半部分的数字的取反
根据这个规律,可以简单实现
代码:
class Solution {
/**
* @param Integer $n
* @param Integer $k
* @return String
*/
function findKthBit($n, $k) {
$p = 0;$u = false;
for($i = $n; $i > 1; $i--){
if($k == pow(2, $i-1)){ // 这里判断是否为最中间的数字
$u = true;
break;
} elseif($k > pow(2, $i-1)){ // 如果它是后面的数字,那么看它是几次取反
$k = $k - 2 * ($k - pow(2, $i-1)); // 将他对应到前半部分
$p++; // 取反次数
}
}
if($u){
if($p % 2 == 0){
return "1";
}
else{
return "0";
}
}
if($p % 2 == 0){
return "0";
} else {
return "1";
}
}
}