腾讯2016校招试题----------格雷码的实现

问题:产生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.格雷码(百度百科)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于A/D方面的小结

&#xff08;转载&#xff09;AD精度与分辨率 最近做了一块板子&#xff0c;当然考虑到元器件的选型了&#xff0c;由于指标中要求精度比较高&#xff0c;所以对于AD的选型很慎重。 很多人对于精度和分辨率的概念不清楚&#xff0c;这里我做一下总结&#xff0c;希望大家不要…

常用表的字段

F:\study\表的设计 一&#xff1a;网站设置有哪些内容&#xff1a; 1>title 表题 2>logo 3>keyword 关键字 4>status 是否开启 5>Internet 备案号 6>url 网址 7>tel 联系电话 8>brief …

四个好看的CSS样式表格

1. 单像素边框CSS表格 这是一个非经常常使用的表格样式。 源码&#xff1a; <!-- CSS goes in the document HEAD or added to your external stylesheet --> <style type"text/css"> table.gridtable { font-family: verdana,arial,sans-serif; font-si…

C# COM ArcgisEngine 多线程相关

这段时间做ArcgisEngine&#xff0c;因为在做图形交叉分析时&#xff0c;计算数据分多个线程分别计算不同的图形&#xff0c;发现计算错误。后来初步了接了是由于所有的ArcObjects组件都被标记为单线程单元&#xff08;STA参考VS帮助文档&#xff09;。每个STA都限制在一个线程…

loading initial ramdisk 卡住_驿站晨读 | 一城市多家快递“卡住了”!有快递网点直接建议:换别家吧......

编辑&#xff1a;驿站老鬼 主播&#xff1a;若晨‍▎美团回应“外卖小哥致电取餐被打成颅脑损伤”10月15日晚&#xff0c;成都温江区某小区内发生一起顾客殴打外卖员事件&#xff0c;导致外卖员冯某东轻度颅脑损伤以及右膝外侧半月板撕裂。据了解&#xff0c;事件起因是顾客要…

CVTE2016校招试题摘选

今年的题分两部分&#xff0c;时间为晚上7:00-9:30,题目分不定项选择与两道编程题。 下面是我自己抄下来的一部分题&#xff0c;尽飨读者。 1.堆排序属于下面哪种排序方法&#xff1f; A、选择排序 B、插入排序、C、交换排序 D、归并排序 答案&#xff1a; A 2. 用RSA算法…

高手的经验 硬件

一个硬件高手的设计经验分享(ZT)大字体 楼主 一&#xff1a;成本节约现象一&#xff1a;这些拉高/拉低的电阻用多大的阻值关系不大&#xff0c;就选个整数5K吧点评&#xff1a;市场上不存在5K的阻值&#xff0c;最接近的是 4.99K&#xff08;精度1%&#xff09;&#xff0c;其…

JavaScript大神用代码带你揭秘吉普赛古老神秘读心术

javascript/HTML5课题&#xff1a;javascript开发读心术游戏PS:大爆料&#xff01;javascript解密读心术游戏背后故事知识点&#xff1a;读心术原理算法独家揭秘&#xff0c;HTML5最新选择器&#xff0c;原生javascript动态DOM生成&#xff0c;判断与循环讲解&#xff0c;函数封…

Firefox火狐Flash插件卡死问题完美解决方法(转载)

http://www.ihacksoft.com/firefox-flash-protectedmode.html 其实这个问题以前就出现过&#xff0c;而最近该问题又出现在最新的 Windows 8.1 系统中。由于从Flash Player 11.3开始&#xff0c;新版本引入了安全沙箱技术&#xff0c;而它一直就是火狐无法正常运行的主要原因。…

.NET Framework 4.5 五个很棒的特性

转自http://news.cnblogs.com/n/192958/ 英文原文&#xff1a;Five Great .NET Framework 4.5 Features 简介 自 .NET 4.5 发布已经过了差不多 1 年了。但是随着最近微软大多数的发布&#xff0c;与 .NET 开发者交流的问题显示&#xff0c;开发者仅知道一到两个特性&#xff0c…

group by很多字段是不是会很慢_女生回复我总很慢,怎么办?

原标题&#xff1a;女生回复我总很慢&#xff0c;怎么办&#xff1f;Hello&#xff0c;大家好&#xff0c;我是情圣老司机。有一种问题&#xff0c;可能属于年轻人才会遇到的问题年轻的兄弟总想控制一切&#xff0c;一切都掌控在自己手上包括今天这个主题&#xff1a;女生总是回…

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

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

天堂avatar

2010年2月2日晚上12看完期待已久的AVATAR&#xff0c;普通3D。说实在的&#xff0c;没有预想中的那么好&#xff0c;可能是由于过于期待导致要求太高的缘故。影片故事比较俗套&#xff0c;一如既往的美式英雄主义&#xff0c;最后一分钟力挽狂澜。但想想它毕竟是一部商业片&…

BZOJ 1012: [JSOI2008]最大数maxnumber(线段树)

裸的线段树...因为数组开小了而一直RE..浪费了好多时间..--------------------------------------------------------------------------#include<cstdio>#include<algorithm>#include<cstring>#include<cctype>#include<iostream>#define rep(i…

如何利用循环代替递归以防止栈溢出(译)

摘要&#xff1a;我们经常会用到递归函数&#xff0c;但是如果递归深度太大时&#xff0c;往往导致栈溢出。而递归深度往往不太容易把握&#xff0c;所以比较安全一点的做法就是&#xff1a;用循环代替递归。文章最后的原文里面讲了如何用10步实现这个过程&#xff0c;相当精彩…

python环境搭建_Python开发环境搭建安装开发软件

0.学习路径示意图各位小伙伴大家好&#xff0c;这次楼主分享的是Ubuntu上安装开发软件。包含以下这几个软件&#xff1a;PycharmAnaconda3GitVim远程登录软件RangerPS&#xff1a;因为以下安装包都是以root身份安装的因此&#xff0c;要使用它们必须以root身份登录su # 以root…

2023首届溪口冬笋节开幕 掀起溪口竹笋产业新浪潮

今年冬至&#xff0c;龙游县溪口镇迎来阵势浩大的“新气象”。 2023年12月22日&#xff0c;由龙游县溪口镇人民政府主办&#xff0c;“美好冬至 竹梦未来”首届溪口冬笋节于溪口老街正式开幕&#xff0c;展开为期一周的竹笋产业文化、经济活动宣传&#xff0c;龙游县领导、及社…

离散卷积的C语言实现

卷积公式可以去wiki上搜索&#xff0c;这里就不贴出了&#xff0c;具体的算法要参考MATLAB help中查看conv函数。根据conv的定义&#xff0c;我写出下面的程序&#xff0c;可以直接在MATLAB进行验证。唉&#xff0c;虽然程序是写出来&#xff0c;可心里对卷积还是有一种抓不住的…

最常见的读入数据方法集锦

我在程序编写过程中&#xff0c;经常会遇到读入数据的问题&#xff0c;大概这类问题分为两种&#xff0c;一种是从控制台读取&#xff0c;一类是从文件读取&#xff0c;我这里收集了一些常见的读取方法&#xff0c;以供参考。 控制台读取&#xff1a; 情景一、有一个程序要求…

【翻译自mos中文文章】重建控制文件的方法

重建控制文件的方法 參考原文&#xff1a; How to Recreate a Controlfile (Doc ID 735106.1) 适用于&#xff1a; Oracle Database - Enterprise Edition - Version 9.0.1.0 and later Information in this document applies to any platform. 解决方式&#xff1a; 警告&…