递归生成格雷码----腾讯2016研发工程师编程题

来源:互联网 发布:厦门大学网络课程中心 编辑:程序博客网 时间:2024/06/05 02:48

[编程题] 生成格雷码

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码。

给定一个整数n,请返回n位的格雷码,顺序为从0开始。

测试样例:
1
返回:["0","1"]

<span style="font-size:18px;">//方法一:递归//递归的思路就是n位gray码是由n-1位gray码生成,举个例子简单一些://比如求n=3的gray码,首先知道n=2的gray码是(00,01,11,10)//那么n=3的gray码其实就是对n=2的gray码首位添加0或1生成的,添加0后变成(000,001,011,010)//添加1后需要顺序反向就变成(110,111,101,100)//组合在一起就是(000,001,011,010,110,111,101,100)class GrayCode {public:    vector<string> getGray(int n) {        // write code here        vector<string> gray;        if(n == 1){            gray.push_back("0");            gray.push_back("1");            return gray;        }        vector<string> last_gray = getGray(n-1);        for(int i = 0; i < last_gray.size(); i++)            gray.push_back("0"+last_gray[i]);        for(int i = last_gray.size()-1; i >= 0; i--)            gray.push_back("1"+last_gray[i]);                 return gray;    }}; //方法二:利用公式G(n) =  n XOR (n/2),求得gray码的十进制之后再转换成二进制字符串class GrayCode {public:    string getbinarystr(int num, int n){        string binarystr = "";        while(num){            int remain = num % 2;            stringstream ss;            ss << remain;            string remainstr;            ss >> remainstr;            binarystr = remainstr + binarystr;            num = num / 2;            n--;        }        while(n--)            binarystr = "0" + binarystr;        return binarystr;    }    vector<string> getGray(int n) {        // write code here        int pown = pow(2, n);        vector<string> gray;        for(int i = 0; i < pown; i++){            int graynum = i ^ (i/2);            string graystr = getbinarystr(graynum,n);            gray.push_back(graystr);        }        return gray;    }};</span>



1 0