LeetCode OJ--Gray Code **

http://oj.leetcode.com/problems/gray-code/ 

求格雷码的表示,主要应用递归。

递归生成码表

这种方法基于格雷码是反射码的事实,利用递归的如下规则来构造:
  1. 1位格雷码有两个码字
  2. (n+1)位格雷码中的前2n个码字等于n位格雷码的码字,按顺序书写,加前缀0
  3. (n+1)位格雷码中的后2n个码字等于n位格雷码的码字,按逆序书写,加前缀1
    #include <iostream>
    #include <vector>
    #include <Cmath>
    using namespace std;
    
    class Solution {
    public:
        vector<vector<int> > ans;
    
        vector<int> generateGrayCode(int i,int j,int num_bits)
        {
            vector<int> ansTemp;
            if(j == 0 && i == 0)
            {
                ansTemp.push_back(0);
                return ansTemp;
            }
            else if(j == 0 && i == 1)
            {
                ansTemp.push_back(1);
                return ansTemp;
            }
            
            if(i< pow(2,(double)num_bits))
            {
                ansTemp = generateGrayCode(i,j-1,num_bits-1); //顺序
                ansTemp.push_back(0);
            }
            else
            {
                ansTemp = generateGrayCode( 2*pow(2,(double)num_bits) - i -1 ,j-1,num_bits-1); //逆序
                ansTemp.push_back(1);
            }
            
            return ansTemp;
        }
        
        vector<int> grayCode(int n) {
            vector<int> answerInt;
            answerInt.clear();
            if(n == 0)
            {
                answerInt.push_back(0);
                return answerInt;
            }
            ans.clear();
            vector<int> onePiece;
            for(int i = 0;i< pow(2,(double)n);i++)
            {
                onePiece = generateGrayCode(i,n-1,n-1);
                ans.push_back(onePiece);
            }
            int i_ans = 0;
            
            for(int i = 0;i< pow(2,(double)n) ;i++)
            {
                onePiece = ans[i];
                //转换成整数
                i_ans = 0;
                for(int mm = n-1;mm>=0;mm--)
                {
                    i_ans *=2;
                    i_ans += onePiece[mm];
                }
                answerInt.push_back(i_ans);
            }
            return answerInt;
        }
    };
    
    int main()
    {
        Solution myS;
        myS.grayCode(0);
        return 0;
    }
原文地址:https://www.cnblogs.com/qingcheng/p/3528176.html