779. 第K个语法符号

这篇博客探讨了一种基于数列规律的问题,其中每一行的生成是基于上一行的字符进行取反操作。通过示例解释了如何找到第n行的第k个字符,提供了两种解决方案:一种是使用while循环,另一种是采用递归方法。算法思路清晰,通过不断减小问题规模来求解目标值。
摘要由CSDN通过智能技术生成

问题描述:
我们构建了一个包含 n 行( 索引从 1 开始 )的表。首先在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为01,1替换为10。

例如,对于 n = 3 ,第 1 行是 0 ,第 2 行是 01 ,第3行是 0110 。
给定行数 n 和序数 k,返回第 n 行中第 k 个字符。( k 从索引 1 开始)

示例:
输入: n = 2, k = 2 输出: 1 解释: 第一行: 0 第二行: 01

算法思路:
先推到第四行看看。
红色为新添的数字
红色为新添的数字。

明显发现其实每一行都是新添一个取反(上一行的数)
0 取反为 1, 0 1 取反为1 0

假设我们查询第四行的第7个数,第七个数必是第三个数(7-4=3)的取反,第三个数即“1”,第三个数是第三行新添来的,必是第一个数(3-2=1)的取反。第一个数是0,故第三个数是1,第七个数也就是0。

直接上代码:

  1. 用while的方式实现
public int kthGrammar(int n, int k) {
        int flag = 0;
        while(k != 1){
            double a = Math.pow(2,n-2);
            if(k>a){
                k -= a;
                flag = 1 ^ flag; //异或
            }
            n--;
        }
        return flag;
    }

在这里插入图片描述

  1. 用递归方式实现
public int kthGrammar(int n, int k) {
        // 递归的方式
        if(k == 1){
            // 第一行的数是0
            return 0;
        }

        // 如果不是本行添加的,那就到上一行再处理
        if(k <= (1 << (n - 2))){
            return kthGrammar(n-1,k);
        }
        return 1 ^ kthGrammar(n-1,k-(1 << (n - 2)));
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

范大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值