Leetcode 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 0
2 01
3 0110
4 01101001
5 0110100110010110
6 01101001100101101001011001101001
-
暴力构造第N行字符串:
显然让i为奇数行时,其为(i-1)行+(i-1)行的reverse
i为偶数行时,其为(i-1)行+(i-1)行各位取反
总之会有一个地方就是,前面永远会是相同的。可知第i行共有2^(i-1)个字符,所以我们不必求到第N行,只要求的所在行字符大于等于K即可。 -
递归法:
找规律,我们可以发现,第K个数字是上一行第(K+1)/2个数字生成的。如果上一行的数字为0,被生成的数字为1-(K%2);如果上一行的数字为1,被生成的数字为K%2。
详细过程见代码
代码
int kthGrammar(int N, int K) {
if(N == 1) return 0;
return ((~K) & 1)^kthGrammar(N-1,(K+1)/2);
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/k-th-symbol-in-grammar
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。