騰訊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.pswp.cn/news/259179.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259179.shtml
英文地址,請注明出處:http://en.pswp.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; 警告&…