leetcode779 第k个语法符号。
直接找规律。
第一行 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个语法符号。的更多相关文章
- [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 ...
- Java实现 LeetCode 779 第K个语法符号(递归)
779. 第K个语法符号 在第一行我们写上一个 0.接下来的每一行,将前一行中的0替换为01,1替换为10. 给定行数 N 和序数 K,返回第 N 行中第 K个字符.(K从1开始) 例子: 输入: N ...
- 第K个语法符号
在第一行我们写上一个 0.接下来的每一行,将前一行中的0替换为01,1替换为10. 给定行数 N 和序数 K,返回第 N 行中第 K个字符.(K从1开始) 例子: 输入: N = 1, K = 1输出 ...
- 779. 第K个语法符号
<找规律> <递归> 题目描述 在第一行我们写上一个 0.接下来的每一行,将前一行中的0替换为01,1替换为10. 给定行数 N 和序数 K,返回第 N 行中第 K个字符.(K ...
- 抽象语法符号ASN.1(Abstract Syntax Notation One)
一.ASN.1 (Abstract Syntax Notation One) ASN.1包括两部分:数据描述语言(ISO 8824)和数据编码规则(ISO 8825).ASN.1的数据描述语言允许 ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- C#LeetCode刷题-递归
递归篇 # 题名 刷题 通过率 难度 687 最长同值路径 30.8% 简单 698 划分为k个相等的子集 30.7% 中等 726 原子的数量 37.2% 困难 761 特殊的二进制序列 ...
- 开源语法分析器--ANTLR
序言 有的时候,我还真是怀疑过上本科时候学的那些原理课究竟是不是在浪费时间.比方学完操作系统原理之后我们并不能自己动手实现一个操作系统:学完数据库原理我们也不能弄出个像样的DBMS出来:相同,学完 ...
- 前端学PHP之正则表达式基础语法
前面的话 正则表达式是用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分割.匹配.查找及替换操作.在PHP中,正则表达式一般是由正规字符和一些特殊字符(类似于通配符)联合构成的一个文本 ...
随机推荐
- vue 监听父子组件传参,对象数据变化
watch:{ 组件传参的字段 :{ handler (newV, oldV){ 这里打印 newV, oldV 就可以看到数据变化了 } , immediate: true, // 重点 deep: ...
- 通俗易懂讲解Word2vec的本质
本文首发于微信公众号「对白的算法屋」,来一起学AI叭 一.Word2vec CBOW(Continuous Bag-of-Words):每个词的含义都由相邻词决定. Skip-gram:依据分布的相似 ...
- APT组织跟踪与溯源
前言 在攻防演练中,高质量的蓝队报告往往需要溯源到攻击团队.国内黑产犯罪团伙.国外APT攻击. 红队现阶段对自己的信息保护的往往较好,根据以往溯源成功案例来看还是通过前端js获取用户ID信息.mysq ...
- Python - 面向对象编程 - __repr__()
为什么要讲 __repr__ 在 Python 中,直接 print 一个实例对象,默认是输出这个对象由哪个类创建的对象,以及在内存中的地址(十六进制表示) 假设在开发调试过程中,希望使用 print ...
- adb - Performing Push Install adb: error: failed to get feature set: more than one 解决方案
问题背景 直接 adb install 包名 无法安装成功 解决方案 安装 adb -s 10.200.241.215:5555 install test.apk 删除 adb -s 10.200. ...
- DOM对象入门
1.概念 2.script最好是放在后面,等html的文档内容加载完毕,不然获取不到 3.事件基本操作 第一种绑定事件html和js耦合度高,用第二种 4.灯开关事件使用
- AI:用软件逻辑做硬件爆款
"我们的野心不止那么一点点." 百度集团副总裁.百度智能生活事业群组(SLG)总经理.小度CEO景鲲曾多次对外表达过这样的观点. 在2021年百度世界大会上,小度又一口气发布了四款 ...
- 远程线程注入DLL突破session 0 隔离
远程线程注入DLL突破session 0 隔离 0x00 前言 补充上篇的远程线程注入,突破系统SESSION 0 隔离,向系统服务进程中注入DLL. 0x01 介绍 通过CreateRemoteTh ...
- 大数据最后一公里——2021年五大开源数据可视化BI方案对比
个人非常喜欢这种说法,最后一公里不是说目标全部达成,而是把整个路程从头到尾走了一遍. 大数据在经过前几年的野蛮生长以后,开始与数据中台的概念一同向着更实际的方向落地.有人问,数据可视化是不是等同于数据 ...
- vue父组件中调用子组件的方法
Vue项目中如何在父组件中直接调用子组件的方法: 方案一:通过ref直接调用子组件的方法: //父组件中 <template> <div> <Button @click= ...