lintcode-411-格雷编码
411-格雷编码
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个二进制的差异。
给定一个非负整数 n ,表示该代码中所有二进制的总数,请找出其格雷编码顺序。一个格雷编码顺序必须以 0 开始,并覆盖所有的 2n 个整数。注意事项
对于给定的 n,其格雷编码顺序并不唯一。
根据以上定义, [0,2,3,1] 也是一个有效的格雷编码顺序。样例
给定 n = 2, 返回 [0,1,3,2]。其格雷编码顺序为:
00 - 0
01 - 1
11 - 3
10 - 2挑战
O(2^n) 时间复杂度。
标签
二进制 递归
思路
参考http://blog.csdn.net/beiyeqingteng/article/details/7044471
除了最高位(左边第一位),格雷码的位元完全上下对称(看下面列表)。比如第一个格雷码与最后一个格雷码对称(除了第一位),第二个格雷码与倒数第二个对称,以此类推。
最小的重复单元是 0 , 1。000
001
011
010
110
111
101
100所以,在实现的时候,我们完全可以利用递归,在每一层前面加上0或者1,然后就可以列出所有的格雷码。
比如:
- 第一步:产生 0, 1 两个字符串。
- 第二步:在第一步的基础上,每一个字符串都加上0和1,但是每次只能加一个,所以得做两次。这样就变成了 00,01,11,10(注意对称)。
- 第三步:在第二步的基础上,再给每个字符串都加上0和1,同样,每次只能加一个,这样就变成了000,001,011,010,110,111,101,100。
好了,这样就把3位元格雷码生成好了。
如果要生成4位元格雷码,我们只需要在3位元格雷码上再加一层0,1就可以了:0000,0001,0011,0010,0110,0111,0101,0100,1100,1101,1110,1010,0111,1001,1000.
也就是说,n位元格雷码是基于n-1位元格雷码产生的。
code
class Solution {
public:
/*
* @param n: a number
* @return: Gray code
*/
vector<int> grayCode(int n) {
// write your code here
if (n <= 0) {
return vector<int>(1, 0);
}
vector<string> strs = grayCodeOfString(n);
vector<int> result;
for (int i = 0; i < strs.size(); i++) {
result.push_back(bitStringToInt(strs[i]));
}
return result;
}
vector<string> grayCodeOfString(int n) {
vector<string> strs(pow(2, n), "");
if (n == 1) {
strs[0] = "0";
strs[1] = "1";
return strs;
}
vector<string> last = grayCodeOfString(n - 1);
for (int i = 0; i < last.size(); i++) {
strs[i] = "0" + last[i];
strs[strs.size() - 1 - i] = "1" + last[i];
}
return strs;
}
int bitStringToInt(string str) {
int result = 0, pow = 1;
for (int i = str.size() - 1; i >= 0; i--) {
result += ((str[i] - '0') * pow);
pow *= 2;
}
return result;
}
};
lintcode-411-格雷编码的更多相关文章
- lintcode:格雷编码
格雷编码 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个二进制的差异. 给定一个非负整数 n ,表示该代码中所有二进制的总数,请找出其格雷编码顺序.一个格雷编码顺序必须以 0 开始, ...
- [Swift]LeetCode89. 格雷编码 | Gray Code
The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...
- 【leetcode-89 动态规划】 格雷编码
( 中等难度题(×) -背答案题(√) ) 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异. 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列.格雷编码序列必须以 ...
- leetcode(js)算法89之格雷编码
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异. 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列.格雷编码序列必须以 0 开头 示例 1: 输入: 2 输出: [ ...
- LeetCode(89):格雷编码
Medium! 题目描述: 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异. 给定一个代表编码总位数的非负整数 n,打印格雷码序列.格雷码序列必须以 0 开头. 例如,给定 ...
- leecode第八十九题(格雷编码)
class Solution { public: vector<int> grayCode(int n) { vector<int> res; res.push_back(); ...
- 089 Gray Code 格雷编码
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异.给定一个代表编码总位数的非负整数 n,打印格雷码序列.格雷码序列必须以0开头.例如, 给定 n = 2, 返回 [0,1,3 ...
- Leetcode 89.格雷编码
格雷编码 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异. 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列.格雷编码序列必须以 0 开头. 示例 1: 输入: 2 ...
- 力扣—gray code (格雷编码) python实现
题目描述: 中文: 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异. 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列.格雷编码序列必须以 0 开头. 英文: Th ...
- LeetCode刷题笔记-贪心法-格雷编码
题目描述: 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异. 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列.格雷编码序列必须以 0 开头. 来源:力扣(Leet ...
随机推荐
- 遍历collection是否会出现重复遍历?
在处理一次线上问题时,需要遍历一张玩家信息表,看单个account是否存在多个entity.使用aid_playerid_dict建立aid到playerid的映射,遍历过程中,发现同一个aid会出现 ...
- DELPHI DOUBLE不解之迷
procedure TForm1.cmd2Click(Sender: TObject);var str1, str2: string; LValue1: Double; LValue2: Extend ...
- 一图看懂hadoop分布式文件存储系统HDFS工作原理
一图看懂hadoop分布式文件存储系统HDFS工作原理
- docker入门——安装(CentOS)、镜像、容器
Docker简介 什么是docker 官方解释: Docker is the company driving the container movement and the only container ...
- JavaScript中使用比较多的两种创建对象的方式
1.使用组合模式创建对象 原型模式创建对象适合封装方法,构造方法模式创建对象适合封装属性 组合方法缺点:将构造方法和原型分开写 <script type="text/javascrip ...
- scala (6) Map
在scala中Map分为可变长(mutable)和不可变长(imtable) /** * 不可变长map 长度一旦初始化,就不能在进行更改 */ // 通过对偶元组的方式创建map val map = ...
- Java基本修饰符
java中的修饰符分为类修饰符,字段修饰符,方法修饰符.根据功能的不同,主要分为以下几种: *权限访问修饰符(可以用来修饰类.方法和字段) 适用范围<访问权限范围越小,安全性越高> 访问权 ...
- libuv源码分析
项目开发过程中经常使用了基于libuv库封装的库接口来实现异步处理,一直没仔细研究过这些接口的内部如何实现,因此也就没有掌握它的设计思想.今天花了点时间研究了其事件循环内部的一些过程,总算有了一些理解 ...
- 【转载】TCP/IP 之 大明王朝邮差
原文:TCP/IP 之 大明王朝邮差 原创 2016-05-12 刘欣 码农翻身 前言: 本文主要想说一下TCP的知识, 比喻有不恰当之处,敬请包涵. 大明王朝天启四年, 清晨. 天色刚蒙蒙亮,我就赶 ...
- PHP5.4 连接 SQL SERVER 2008
PHP链接sqlserver需要先安装驱动,不是先把dll放到ext下面,一重启服务器就完事了. 本地环境: XAMPP 1.8.2 PHP 5.4.31 SQL SERVER 2008 R2 使用的 ...