这个题LintCode上题目貌似替代的时候说反了,我更正了。。。。。
描述
在第一行,我们写一个0。现在在之后的每一行,我们观察之前一行并且用01替换出现的0,用10替换出现的1。
给出行号N和索引K,返回N行K-th索引的符号。(K的值为1-indexed)(1 indexed)。
1.N是一个[1,30]区间的整数。
2.K是一个[1,2^(N-1)]区间的整数。
样例
样例 1:
输入:N = 1, K = 1
输出:0
解释:
行 1: 0
样例 2:
输入:N = 2, K = 1
输出:1
解释:
行 1: 0
行 2: 01
样例 3:
输入:N = 2, K = 2
输出:1
解释:
行 1: 0
行 2: 01
样例 4:
输入:N = 4, K = 5
输出:1
解释:
行 1: 0
行 2: 01
行 3: 0110
行 4: 01101001
class Solution {
public:
/**
* @param N: the row
* @param K: the index
* @return: the K-th indexed symbol in row N
*/
/*
算法:
当k%2=0时第N行的第K个由第N-1行第(K/2)个变换而成,且结果相反
当k%2=1时第N行的第K个由第N-1行第(K/2)+1个变换而成,且结果相同
*/
int kthGrammar(int N, int K) {
// Write your code here
int res;
if(N==1)
return 0;
if(N>1)
{
if(K%2==0)
res=kthGrammar(N-1, K/2)^1;//与1与操作,相当于取反
else
res=kthGrammar(N-1, (K/2)+1);
}
return res;
}
};