直接找规律。

第一行 0

第二行 01

第三行 0110

第四行 01101001

可以发现,第n行的数量比第n-1行多了一倍,并且前半部分是和第n-1行一样的,后半部分是前半部分“按位取反”得到的。

第n行的字符数量是2(n-1)个,因此第n-1行的数量就是2(n-2)个。公式为:

func(n,k) = func(n-1,k), if k <= 2^(n-2)
func(n,k)= ^func(n-1,k-2^(n-2)), if k >2^(n-2)

写了如下的代码:

class Solution {
public:
int kthGrammar(int N, int K) {
if(N == 1 || N == 0) return 0; int tmp = 2^(N-2);//第n行有多少个数,有2的n-1个数,
if(K <= tmp){
return kthGrammar(N-1,K);
}else{
return ~kthGrammar(N-1,K-tmp);//01互换
}
}
};

代码报错,问题在哪?

问题就在于,C++没有求幂的运算符,所以你用2^(N-2)是错误的。得到的结果还是2。

C++求幂只能用pow(x,y),C++中的^是按位异或运算符号。

使用pow(x,y)用math.h头文件。

还有什么问题?

如果第二种情况,求到的是0,就应该返回1,求到的是1就应该返回0.使用~表达为什么会错?

不能用运算符来计算0和1,因为得到的并不是0和1的相反。实际用C++求的时候0是-1,~1是-2.

参考 https://www.cnblogs.com/zhgyki/p/9452637.html

那要怎么办? 使用三目运算符。

如果返回的结果是0,就换为1,如果返回的结果是1,就返回0.

class Solution {
public:
int kthGrammar(int N, int K) {
if(N == 1 || N == 0) return 0;
int tmp = pow(2,N-2);
if(K <= tmp){
return kthGrammar(N-1,K);
}else{
return kthGrammar(N-1,K-tmp)==1?0:1;
}
}
};

leetcode题解地址: https://leetcode-cn.com/problems/k-th-symbol-in-grammar/solution/zhi-jie-zhao-gui-lu-fa-by-gradius/

leetcode779 第k个语法符号。的更多相关文章

  1. [Swift]LeetCode779. 第K个语法符号 | K-th Symbol in Grammar

    On the first row, we write a 0. Now in every subsequent row, we look at the previous row and replace ...

  2. Java实现 LeetCode 779 第K个语法符号(递归)

    779. 第K个语法符号 在第一行我们写上一个 0.接下来的每一行,将前一行中的0替换为01,1替换为10. 给定行数 N 和序数 K,返回第 N 行中第 K个字符.(K从1开始) 例子: 输入: N ...

  3. 第K个语法符号

    在第一行我们写上一个 0.接下来的每一行,将前一行中的0替换为01,1替换为10. 给定行数 N 和序数 K,返回第 N 行中第 K个字符.(K从1开始) 例子: 输入: N = 1, K = 1输出 ...

  4. 779. 第K个语法符号

    <找规律> <递归> 题目描述 在第一行我们写上一个 0.接下来的每一行,将前一行中的0替换为01,1替换为10. 给定行数 N 和序数 K,返回第 N 行中第 K个字符.(K ...

  5. 抽象语法符号ASN.1(Abstract Syntax Notation One)

      一.ASN.1 (Abstract Syntax Notation One) ASN.1包括两部分:数据描述语言(ISO 8824)和数据编码规则(ISO 8825).ASN.1的数据描述语言允许 ...

  6. Swift LeetCode 目录 | Catalog

    请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift    说明:题目中含有$符号则为付费题目. 如 ...

  7. C#LeetCode刷题-递归

    递归篇 # 题名 刷题 通过率 难度 687 最长同值路径   30.8% 简单 698 划分为k个相等的子集   30.7% 中等 726 原子的数量   37.2% 困难 761 特殊的二进制序列 ...

  8. 开源语法分析器--ANTLR

      序言 有的时候,我还真是怀疑过上本科时候学的那些原理课究竟是不是在浪费时间.比方学完操作系统原理之后我们并不能自己动手实现一个操作系统:学完数据库原理我们也不能弄出个像样的DBMS出来:相同,学完 ...

  9. 前端学PHP之正则表达式基础语法

    前面的话 正则表达式是用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分割.匹配.查找及替换操作.在PHP中,正则表达式一般是由正规字符和一些特殊字符(类似于通配符)联合构成的一个文本 ...

随机推荐

  1. system的使用

    <stdio.h>       std是一个标准库,i =input   o =output      标准输入输出库    .h头文件   system的使用   功能:在已经运行的程序 ...

  2. zap高性能日志

    摘要 日志在整个工程实践中的重要性不言而喻,在选择日志组件的时候也有多方面的考量.详细.正确和及时的反馈是必不可少的,但是整个性能表现是否也是必要考虑的点呢?在长期的实践中发现有的日志组件对于计算资源 ...

  3. 代码保留格式(高亮)复制到Word(转载)

    将代码保持高亮复制粘贴到word上,一些方法如下: 方法一:借助网站http://www.planetb.ca/syntax-highlight-word/(代码有编号,整体排版精美令人舒适,但语言有 ...

  4. Mysql常用基础命令操作

    常见操作命令:1.连接Mysql (客户端工具NaviCat.phpMyAdmin.MySQL-Front)格式: mysql -h 主机地址 -u用户名 -p用户密码(1)连接到本机上的MYSQL. ...

  5. K8S的部署方式

    K8S部署主要有两种方式:

  6. python 加速运算

    原文链接:https://blog.csdn.net/qq_27009517/article/details/103805099 一.加速查找 1.用set而非list import time dat ...

  7. Pytest系列(12)- 测试结果生成HTML报告插件之pytest-html的详细使用

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 环境前提 Python3.6+ 安 ...

  8. JUnit5 快速入门指南

    1. 安装 在pom中添加依赖 <properties> <junit.jupiter.version>5.3.2</junit.jupiter.version> ...

  9. 【曹工杂谈】Maven IOC 容器-- Guice内部有什么

    Google Guice容器内部有什么 前言 Maven系列,好几天没写了,主要是这几天被Google Guice卡住了,本来是可以随便带过Guice,讲讲guice的用法就够了(这个已经讲了,在前面 ...

  10. 在FLASH中读写结构体

    在FLASH中读写结构体 注意事项 编程(写数据)地址要对齐 写数据时,我们要指定写入的地址,如果写入地址为非对齐,则会出现编程对齐错误. 比如遵循32位(4字节)地址对齐,你的地址只能是4的倍数.0 ...