779. 第K个语法符号

在第一行我们写上一个 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, 30].
K 的范围 [1, 2^(N-1)].

思路:
找规律的题目
规律1:N大于2时,N是奇数的话,第N行的前半段和后半段是镜面对称的
规律2:N大于1时,N是偶数的话,第N行的前半段和后半段是互补的
因此可以递归实现,函数kthGrammar( N, K)即为第N行的第K个字符
则有kthGrammar(N,1)=0,kthGrammar(N,2)=1

class Solution {
public:
	int kthGrammar(int N, int K) 
	{
		if (K > pow(2, N - 1))
			return -1;
		if (K == 1)
			return 0;
		if (K == 2)
			return 1;
		int mid=pow(2,N-2);
		if (K > mid)
		{
			if (N % 2 == 1)//奇数行的后半段就是上一行(偶数行)的镜面对称
				return kthGrammar(N - 1, pow(2, N - 1) - K + 1);
			else//偶数行的后半段就是上一行的互补
				return !kthGrammar(N - 1, pow(2, N - 1) - K + 1);
		}
		else
			return kthGrammar(N - 1, K);
	}
};

猜你喜欢

转载自blog.csdn.net/qq_43069546/article/details/87606847