LeetCode(779):第K个语法符号 K-th Symbol in Grammar(Java)

这篇博客探讨了解决LeetCode第779题的两种方法,主要使用Java实现。第一种思路是将问题转化为二叉树问题,通过递归获取结果;第二种思路是通过观察序列规律,利用K的奇偶性和二进制位运算减少递归次数。文章还提到了Integer.bitCount()方法在优化过程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2019.8.14 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)

这道题有两种思路:

1.可以将序列看成一棵二叉树,那么每一个左子结点与父节点相同,右节点与父节点相反,而K的奇偶又在满二叉树数组中代表了左右子树,可以很容易用递归获得结果。

2.观察可以发现每一层数组每一个后半部分正好是前半部分取反,那么如果K位于数组的后半部分,必然能够找到前半部分所对应的反码位置K -= (1 << N-2)。进行递归操作不断对后半部分的K取反,可以获得结果。

但事实上我们不必层层递归,只需要知道K取反的次数即可。K取反的次数恰为K-1中二进制1的个数。因此可以利用Integer.bitCount()方法一步到位,翻转次数为奇数,最终取1,反之为0。


传送门:第K个语法符号

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值