首先发现个规律:
1,在n增大过程中,前半部分是不变的。
2,n为偶数,对折后值相反
3,n为奇数,中轴对称
直接想法,倒着计算即可。
/*
* @lc app=leetcode id=779 lang=cpp
*
* [779] K-th Symbol in Grammar
*/
// @lc code=start
class Solution {
public:
int kthGrammar(int n, int k) {
int ans = 0;
while(k > 1 && n > 1){
// 偶数时,k在右侧,需要翻转
if( (n&1) == 0 && k > (1<<n-2) ){
ans = (ans + 1) & 1;
}
k = min(k, (1<<n-1) - k + 1);
n -- ;
}
// 最后是否与0一致
return ans & 1;
}
};
// @lc code=end