• 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;
      }
  • 相关阅读:
    反转链表——临时变量的妙用
    C++指针学习(2)
    统计英文文本中的词频
    灵活的C++
    编程之美 NIM(1)扩展问题
    深度探索C++对象模型读书笔记(1)
    irrlicht1.7.0(2):基础接口
    关于裁剪空间与投影变换矩阵的推导
    irrlicht1.7.0(1):irrTypes.h
    【转】每天拿两个小时来浪费(文/王路)
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3528176.html
Copyright © 2020-2023  润新知