2019.8.14 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)
这道题有两种思路:
1.可以将序列看成一棵二叉树,那么每一个左子结点与父节点相同,右节点与父节点相反,而K的奇偶又在满二叉树数组中代表了左右子树,可以很容易用递归获得结果。
2.观察可以发现每一层数组每一个后半部分正好是前半部分取反,那么如果K位于数组的后半部分,必然能够找到前半部分所对应的反码位置K -= (1 << N-2)。进行递归操作不断对后半部分的K取反,可以获得结果。
但事实上我们不必层层递归,只需要知道K取反的次数即可。K取反的次数恰为K-1中二进制1的个数。因此可以利用Integer.bitCount()方法一步到位,翻转次数为奇数,最终取1,反之为0。
On the first row, we write a 0. Now in every subsequent row, we look at the previous row and replace each occurrence of 0 with 01, and each occurrence of 1 with 10.
Given row N and index K, return the K-th indexed symbol in row N. (The values of K are 1-indexed.) (1 indexed).
在第一行我们写上一个 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)].
/**
* On the first row, we write a 0. Now in every subsequent row, we look at the previous row and replace each occurrence of 0 with 01, and each occurrence of 1 with 10.
* Given row N and index K, return the K-th indexed symbol in row N. (The values of K are 1-indexed.) (1 indexed).
* 在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为01,1替换为10。
* 给定行数 N 和序数 K,返回第 N 行中第 K个字符。(K从1开始)
*/
public class KthSymbolInGrammar {
//递归
public int kthGrammar