【题目】

The gray code is a binary numeral system where two successive values differ in only one bit.

Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.

For example, given n = 2, return [0,1,3,2]. Its gray code sequence is:

00 - 0
01 - 1
11 - 3
10 - 2

Note:
For a given n, a gray code sequence is not uniquely defined.

For example, [0,2,3,1] is also a valid gray code sequence according to the above definition.

For now, the judge is able to judge based on one instance of gray code sequence. Sorry about that.

【题意】

格雷码是一个二进制数字集合,相邻两数间只有一个位元改变。

给定一个非负整数n代表的比特位的总数,打印格雷码序列。格雷码序列必须从0开始。

例如,给定n=2,返回[0,1,3,2]。它的格雷码序列为:

00 - 0
01 - 1
11 - 3
10 - 2

注意

对于给定的n,格雷码序列不是唯一地。

例如,按上述定义[0,2,3,1]也是一个有效的格雷码序列。

现在,判定系统只能够判断基于格雷码序列的一个实例。我们对此深感抱歉。

【分析】

思路1:

格雷码 (Gray Code) 的定义请参考 wikipedia http://en.wikipedia.org/wiki/Gray_code。

  • 自然二进制码转换为格雷码:  

保留自然二进制码的最高位作为格雷码的最高位,格雷码次高位为二进制码的高位与次高位异或,其余各位与次高位的求法类似。

例如,将自然二进制码 1001,转换为格雷码的过程是:

保留最高位;然后将第 1 位的 1 和第 2 位的 0 异或,得到 1,作为格雷码的第 2 位;将第 2 位的 0 和第 3 位的 0 异或,得到 0,

作为格雷码的第 3 位;将第 3 位的 0 和第 4 位的 1 异或,得到 1,作为格雷码的第 4 位,最终,格雷码为 1101。

  • 格雷码转换为自然二进制码:

保留格雷码的最高位作为自然二进制码的最高位,次高位为自然二进制高位与格雷码次高位异或,其余各位与次高位的求法类似。

例如,将格雷码 1000 转换为自然二进制码的过程是:

保留最高位 1,作为自然二进制码的最高位;然后将自然二进制码的第 1 位 1 和格雷码的第 2 位 0 异或,得到1,

作为自然二进制码的第 2 位;将自然二进制码的第 2 位 1 和格雷码的第 3 位 0 异或,得到 1,作为自然二进制码的第 3 位;

将自然二进制码的第 3 位 1 和格雷码的第 4 位 0 异或,得到 1,作为自然二进制码的第 4 位,最终,自然二进制码为 1111。

  • 格雷码有数学公式,整数 n 的格雷码是

这题要求生成 n 比特的所有格雷码。最简单的方法,利用数学公式,对从 0~ 2^n - 1的所有整数,转化为格雷码。

思路2:

n 比特的格雷码,可以递归地从 n  - 1 比特的格雷码生成。

n位元的格雷码可以从n-1位元的格雷码以上下镜射后加上新位元的方式快速的得到,如右图所示一般。

红色的最高位加一即保持不变。

蓝色的最高位加一;n = 1时原格雷码十进制加1 ; n = 2时 加2 ; n = 3时 加 4 ;n= 4时 加 8............

【代码1】

/*********************************
*   日期:2014-01-23
*   作者:SJF0115
*   题号: Gray Code
*   来源:http://oj.leetcode.com/problems/gray-code/
*   结果:AC
*   来源:LeetCode
*   总结:
**********************************/
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;class Solution {
public://数学公式,时间复杂度 O(2^n),空间复杂度 O(1)vector<int> grayCode(int n) {int count = 1 << n;vector<int> code;for(int i = 0;i < count;i++){code.push_back(binaryToGrayCode(i));}return code;}
private:int binaryToGrayCode(int n){return n ^ (n >> 1);}
};
int main() {Solution solution;vector<int> result;result = solution.grayCode(3);int n = result.size();for(int i = 0;i < n;i++){printf("%d ",result[i]);}printf("\n");return 0;
}

【代码2】

/*********************************
*   日期:2014-01-23
*   作者:SJF0115
*   题号: Gray Code
*   来源:http://oj.leetcode.com/problems/gray-code/
*   结果:AC
*   来源:LeetCode
*   总结:
**********************************/
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;class Solution {
public://镜射排列vector<int> grayCode(int n) {int i,j,count,c;vector<int> code;//初始为0位code.push_back(0);for(i = 0;i < n;i++){count = code.size();c = 1 << i;//添加镜面反射的那一部分(最高位加1)//要反着遍历才能对称for(j = count - 1;j >= 0;j--){code.push_back(code[j] + c);}}return code;}
};
int main() {Solution solution;vector<int> result;result = solution.grayCode(3);int n = result.size();for(int i = 0;i < n;i++){printf("%d ",result[i]);}printf("\n");return 0;
}

格雷码转二进制数

二进制码第n位 = 二进制码第(n+1)位+格雷码第n位。因为二进制码和格雷码皆有相同位数,所以二进制码可从最高位的左边位元取0,以进行计算。(注:遇到1+1时结果视为0)
例如: 格雷码0111,为4位数,所以其所转为之二进制码也必为4位数,因此可取转成之二进制码第五位为0,即0 b3 b2 b1 b0。
0+0=0,所以b3=0
0+1=1,所以b2=1
1+1取0,所以b1=0
0+1取1,所以b0=1
因此所转换为之二进制码为0101

[LeetCode]89.Gray Code相关推荐

  1. 【格雷码】LeetCode 89. Gray Code

    LeetCode 89. Gray Code Solution1:我的答案 穷举法,比较笨 注意:牢记vector中find()函数的用法 class Solution { public:vector ...

  2. 89. Gray Code - LeetCode

    为什么80%的码农都做不了架构师?>>>    Question 89. Gray Code Solution 思路: n = 0 0 n = 1 0 1 n = 2 00 01 1 ...

  3. LeetCode(89):格雷编码 Gray Code(Java)

    2019.7.19 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新) 智力题,本题的关键在于搞清楚格雷编码的生成过程, G(i) = i ^ (i/2). 如 n = 3: G( ...

  4. Gray Code LeetCode 89

    题目:The gray code is a binary numeral system where two successive values differ in only one bit. Give ...

  5. LeetCode Gray Code(回溯法)

    问题:gray code是一种二进制数字系统,两个连续的数只有一位不同.给出一个正整数n,n表示gray code的位数,输出gray code. 思路:使用回溯法.通过枚举0,1,2,3的gray ...

  6. [LeetCode]Gray Code

    题目描述:(链接) The gray code is a binary numeral system where two successive values differ in only one bi ...

  7. leetcode笔记:Gray Code(2016腾讯软件开发笔试题)

    2019独角兽企业重金招聘Python工程师标准>>> 一.题目描述 The gray code is a binary numeral system where two succe ...

  8. Gray Code(格雷码) C++多方法实现

    简介 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即"首尾相连",因此又称循环 ...

  9. Ural 1780 Gray Code 乱搞暴力

    原题链接:http://acm.timus.ru/problem.aspx?space=1&num=1780 1780. Gray Code Time limit: 0.5 second Me ...

最新文章

  1. tomcat中request对象是被创建的_常用开源框架中设计模式使用分析(全)
  2. java中example函数作用_MyBatis逆向工程中的Mapper接口以及Example的实例函数及详解...
  3. Redis 主从配置和参数详解
  4. GDCM:DICOM文件的输入和输出流测试程序
  5. 空间数据引擎oracle_GIS 与Oracle 数据库空间数据格式的转换
  6. vue学习笔记-01-前端的发展历史(从后端到前端,再到前后端分离,再到全栈)
  7. VR为难民发声,传递人道主义精神
  8. linux安装nvidia黑屏,GTX 550 Ti 安装Linux遇到的问题 黑屏 显示器休眠
  9. 5. PHP APC APCu 安装使用
  10. MySql 数据库安装、环境变量配置 以及 本地连接
  11. mongodb数据库导出表的流程
  12. 小学英语口语测试软件,最新小学英语口语测试题(四年级)
  13. php的tips(mysql语句union等问题)
  14. php下载地址转换工具,PHP实战:php实现把url转换迅雷thunder资源下载地址的方法...
  15. 让ChatGPT来制作Excel表格,ChatGPT实现文本和表格的相互转换
  16. MobaXterm 详细安装使用教程 官网
  17. 怎么理解VGG-16结构图中的block
  18. IBM SPSS的Sav文件读/写
  19. 梦中不知岁已老,朦胧人间谁登高
  20. WebDriver驱动下载地址

热门文章

  1. 埃拉托色尼筛选法计算素数个数
  2. java具名参数_Spring jdbc具名参数使用方法详解
  3. 4_竞赛无人机基本自动飞行支持函数与导航控制函数解析——零基础学习竞赛无人机搭积木式编程
  4. 华为很快搭载鸿蒙系统,华为高管确认很快将会推出搭载鸿蒙操作系统的智能手表...
  5. js实现小写金额转大写
  6. Linux ifconfig命令无效的解决方法
  7. Linux 文件的加密解密
  8. 华为云云耀云服务器 中小企业的福音
  9. 2022北京冬奥会开幕式视觉盛宴技术揭晓
  10. 关闭win10的防护系统