问题:产生n位元的所有格雷码。
格雷码(Gray Code)是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数字,任两个数之间只有一个位元值不同。
例如以下为3位元的格雷码: 000 001 011 010 110 111 101 100 。
如果要产生n位元的格雷码,那么格雷码的个数为2^n.
假设原始的值从0开始,格雷码产生的规律是:第一步,改变最右边的位元值;第二步,改变右起第一个为1的位元的左边位元;第三步,第四步重复第一步和第二步,直到所有的格雷码产生完毕(换句话说,已经走了(2^n) - 1 步)。
用一个例子来说明:
假设产生3位元的格雷码,原始值位 000
第一步:改变最右边的位元值: 001
第二步:改变右起第一个为1的位元的左边位元: 011
第三步:改变最右边的位元值: 010
第四步:改变右起第一个为1的位元的左边位元: 110
第五步:改变最右边的位元值: 111
第六步:改变右起第一个为1的位元的左边位元: 101
第七步:改变最右边的位元值: 100
如果按照这个规则来生成格雷码,是没有问题的,但是这样做太复杂了。如果仔细观察格雷码的结构,我们会有以下发现:
1、除了最高位(左边第一位),格雷码的位元完全上下对称(看下面列表)。比如第一个格雷码与最后一个格雷码对称(除了第一位),第二个格雷码与倒数第二个对称,以此类推。
2、最小的重复单元是 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位元格雷码产生的。
如果能够理解上面的部分,下面部分的代码实现就很容易理解了。
//格雷码
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
using namespace std;vector<string> GrayCode(int n) {// produce 2^n grade codesvector<string> graycode(int(pow(float(2.), n)));if (n == 1) {graycode[0] = "0";graycode[1] = "1";return graycode;}vector<string>  last = GrayCode(n - 1);for (int i = 0; i < last.size(); i++) {graycode[i] = "0" + last[i];graycode[graycode.size() - i - 1] = "1" + last[i];}return graycode;
}
int main()
{vector<string> graycode = GrayCode(4);for (auto x: graycode){cout << x << endl;}}

参考文献:

1.格雷码的实现
2.格雷码(百度百科)

腾讯2016校招试题----------格雷码的实现相关推荐

  1. (45)FPGA面试题格雷码特点及其应用

    1.1 FPGA面试题格雷码特点及其应用 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题格雷码特点及其应用: 5)结束语. 1.1.2 本节引言 &quo ...

  2. 大众点评网2016校招试题选录

    大众点评网的校招题还真有特点,分四部分,第一部分是行测的数字规律类题目,第二部分是行测的图形规律题,第三部分是C++.Java的基础选择题,第四部分是四个编程题. 题目都有时间限制,第一二部分皆是普通 ...

  3. 牛客网-4 腾讯2016笔试题

    30 小明设计了如下的学籍管理系统: 已知关系:学籍(学号,学生姓名) PK=学号 成绩(科目号,成绩,学号) PK=科目代码,FK=学号 已有表记录如下,请给出能够插入的成绩记录 正确答案: B D ...

  4. 腾讯2016校园招聘·成都线路 移动开发方向,本人止步于二面——腾讯校招面经。

    已经大三,马上就要去实习了,找实习工作是个问题,一个偶然的机会,有幸去了 腾讯2016校园招聘·成都线路,虽然最后在二面被刷下来了,但是也算是一段比较有意义的经历,写下来,算是一个面试的一个提醒,也给 ...

  5. 2016校招腾讯研发岗笔试题---递归法求解格雷码

    题目:一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码( Gray Code ).请编写一个函数,使用递归方法生成 N 位的格雷码. 测试输入输出如下 输入:1 输出:[ ...

  6. 腾讯2016春招安全岗笔试题解析

    腾讯2016春招安全岗笔试题解析 昨天(4月2日)晚上7:00到9:00做了腾讯春招安全岗的笔试题.下面解析一下: 题目解析 1 在生成随机数前用当前时间设置随机数种子应该是安全的.如果程序用固定的数 ...

  7. 腾讯 2016 春季实习校招二面回忆(C++后台)

    感谢您对博文的关注!有需要内推腾讯的可以 QQ(1589276509)联系我哈,期待您的加入. 文章目录 1.前言 2.问题汇总 3.小结 参考文献 1.前言 2016-04-12 日下午在广州东圃喜 ...

  8. 腾讯---生成格雷码

    腾讯-生成格雷码 文章目录 腾讯---生成格雷码 一.题目描述 二.分析 三.代码 一.题目描述 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code ...

  9. (132)FPGA面试题-Verilog实现格雷码转二进制

    1.1 FPGA面试题-Verilog实现格雷码转二进制 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-Verilog实现格雷码转二进制: 5)结束语. ...

最新文章

  1. 通过Spring配置文件中bean中的property赋值
  2. search by Belonging to my team测试 - with manager role
  3. html打包成app的缓存问题,webpack 独立打包与缓存处理
  4. DTCC 2019 | 阿里云TSDB: 教你解锁时序时空数据库的种种黑科技
  5. 另一个串口verilog 代码
  6. Nginx-配置https虚拟服务(访问http时自动跳转https)
  7. Oracle数据库日志清理
  8. laravel响应速度慢
  9. ESL-chapter6 核密度估计和分类
  10. 逆水寒2021最新服务器,【图片】《逆水寒》2021年1月21日更新公告【逆水寒ol吧】_百度贴吧...
  11. CSS中id选择器和类选择器的区别
  12. 法拉克机器人自动怎么调_FANUC机器人:参考位置功能介绍与设定方法
  13. flash 图表(XML动态获取数据)
  14. 链表逆置(三种方法详解)
  15. 超详细解决office2016和visio2016同时安装出错问题
  16. matlab双纵轴刻度覆盖问题,求助: matlab双纵轴换图问题
  17. word排版案例报告_导师:论文排版都搞不好,你拿什么去投稿?!
  18. 《自我分析》卡伦·霍尼阅读笔记1
  19. 渗透杂记-2013-07-10
  20. 小程序如何实现定点跳转其他的小程序(京东、苏宁)的具体店铺或商品页面

热门文章

  1. 修改wordpress上传文件大小限制
  2. Linux进程管理之ps的使用
  3. 第六次实训作业异常处理
  4. bugku_本地包含
  5. easyui datagrid 列拖动
  6. tornado 学习笔记17 HTTPServerRequest分析
  7. 2021前端面试题总结
  8. python --- 使用socket创建tcp服务
  9. bootstrap --- 弹出对话框
  10. JS和Jquery获取和修改label的值