• 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;
      }
  • 相关阅读:
    springCloud学习6(Spring Cloud Sleuth 分布式跟踪)
    springCloud学习5(Spring-Cloud-Stream事件驱动)
    springCloud学习4(Zuul服务路由)
    springCloud学习3(Netflix Hystrix弹性客户端)
    springCloud学习笔记2(服务发现)
    EFCore
    webBrowser.DocumentText重新赋值无效解决方法
    C# SQLite写入和读取DateTime类型
    自定义协议链接 ------2.实践篇
    自定义协议链接 ------1.原理篇
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3528176.html
Copyright © 2020-2023  润新知