版权声明:made by YYT https://blog.csdn.net/qq_37621506/article/details/83073769
递归
- 题目
在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为01,1替换为10。
给定行数 N 和序数 K,返回第 N 行中第 K个字符。(K从1开始)
例子:
输入: N = 1, K = 1
输出: 0
输入: N = 2, K = 1
输出: 0
输入: N = 2, K = 2
输出: 1
输入: N = 4, K = 5
输出: 1
解释:
第一行: 0
第二行: 01
第三行: 0110
第四行: 01101001
- 分析
将每一行写出寻找规律:
n | |
---|---|
1 | 0 |
2 | 0 1 |
3 | 0 1 1 0 |
4 | 0 1 1 0 0 1 1 0 |
5 | 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 0 |
第n行:奇数位与n-1行相同;偶数位置与n-1相反
3. 代码
include <iostream>
using namespace std;
int kthGrammar(int N, int K)
{
if(N==1)
return 0;
else{
if(K%2==1){
return kthGrammar(N-1,K/2+1);
}
else
return !kthGrammar(N-1,K/2);
}
}
int main()
{
int n,m;
while(cin>>n>>m)
{
cout << kthGrammar(n,m) << endl;
}
return 0;
}
参考别人的算法
class Solution {
public:
int kthGrammar(int N, int K) {
if(K==1) return 0;
if(K==2) return 1;
int res=0;
for(int i=N-2;i>=0;--i)
{
if(K>pow(2,i)) {K=K-pow(2,i);res=1-res;
}
return res;
}
};