题目
- 在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为01,1替换为10。
- 给定行数 N 和序数 K,返回第 N 行中第 K个字符。(K从1开始)
大致思路
/**
* 把上一行的0换成01,1换成10
*
* 0
*
* 0 1
*
* 0 1 1 0
*
* 0 1 1 0 1 0 0 1
*
* 规律: 第N行的奇数位是N-1行的数字,偶数位是N-1行数字求非
代码实现
package com.immunize.leetcode.kthGrammar;
/**
* 把上一行的0换成01,1换成10
*
* 0
*
* 0 1
*
* 0 1 1 0
*
* 0 1 1 0 1 0 0 1
*
* 规律: 第N行的奇数位是N-1行的数字,偶数位是N-1行数字求非
*
* @author Mr IMMUNIZE
*
*/
public class Solution {
public int kthGrammar(int N, int K) {
if (N == 1)
return 0;
// 第N行的奇数位与N-1行的相同,偶数位为N-1行求非,但是奇数行和偶数行的求法稍有不同
int res = kthGrammar(N - 1, (K + 1) >> 1);
// K & 0x01 相当于取每一行的最后一个数字,如例所示,为0的时候为奇数行,为1的时候为偶数行
return res == 1 ? ((K & 0x01) == 0 ? 0 : 1) : ((K & 0x01) == 0 ? 1 : 0);
}
}