zoukankan      html  css  js  c++  java
  • Gray Code LeetCode 89

    题目:The gray code is a binary numeral system where two successive values differ in only one bit.

    Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.

    For example, given n = 2, return [0,1,3,2]. Its gray code sequence is:

    00 - 0
    01 - 1
    11 - 3
    10 - 2
    
    这道题其实就是产生格雷码(简直废话~),格雷码是有一定规律的,数电课上学过一点格雷码的规律,但是对于编程解决问题没啥用啊- -,我们还是来找规律吧。4位的,我手写最多写4位
    0000
    0001
    0011
    0110
    0111
    0101
    0100
    1100
    1101
    1111
    1110
    1010
    1011
    1001
    1000
    按列来看,从左往右数第0列(从0列开始),前半部分为0,后半部分为1。第1列,等分成上下两部分,第一部分的前半部分为0,后半部分为1。第二部分的前半部分为1,后半部分为0。
    后面继续看,可以看出规律了。把第i列分成2^i部分,奇数部分的前半部分为0,后半部分为1,偶数部分的前半部分为1,后半部分为0。或者用另外一种表述方法,我们可以把本次的划分看作前一次的划分的
    一个部分,如果是上次划分的前半部分,则符合前面的奇数部分。后半部分则符合前面的后半部分。代码如下:
     1 /*
     2 使用分治法,如果本次属于前一次二分的前半部分,则本次的前半部分第n位填0,后半部分第n位填1
     3             如果本次属于前一次二分的后半部分,则本次的前半部分第n位填1,后半部分第n位填0
     4 第一次填写,设为前半部分。代码中left代表前半部分-_-。
     5 */
     6 
     7 void setGray(int *num, int start, int end, bool left, int n)
     8 {
     9     int lbit, rbit, i = 0;
    10     int mid = (start + end) >> 1;
    11 
    12     if (left)
    13     {
    14         lbit = 0;
    15         rbit = 1 << n;
    16     }
    17     else
    18     {
    19         lbit = 1 << n;
    20         rbit = 0;
    21     }
    22 
    23     for (i = start; i <= mid; ++i)
    24         num[i] = num[i] | lbit;
    25 
    26     for (i = mid + 1; i <= end; ++i)
    27         num[i] = num[i] | rbit;
    28 
    29     if (n > 0)
    30     {
    31         setGray(num, start, mid, true, n - 1);
    32         setGray(num, mid + 1, end, false, n - 1);
    33     }
    34 }
    35 
    36 
    37 int *grayCode(int n, int *returnSize)
    38 {
    39     *returnSize = 1 << n;
    40     int *ans = (int *)malloc(*returnSize * sizeof(int));
    41     int i = 0;
    42     for (i = 0; i < *returnSize; ++i)
    43     {
    44         ans[i] = 0;
    45     }
    46     if (n > 0) setGray(ans, 0, *returnSize - 1, true, n - 1);
    47     return ans;
    48 }
  • 相关阅读:
    Unity 3(一):简介与示例
    MongoDB以Windows Service运行
    动态SQL中变量赋值
    网站发布IIS后堆栈追踪无法获取出错的行号
    GridView Postback后出错Operation is not valid due to the current state of the object.
    Visual Studio 2010 SP1 在线安装后,找到缓存在本地的临时文件以便下次离线安装
    SQL Server 问题之 排序规则(collation)冲突
    IIS 问题集锦
    linux下安装mysql(ubuntu0.16.04.1)
    apt-get update 系列作用
  • 原文地址:https://www.cnblogs.com/DennisXie/p/4792928.html
Copyright © 2011-2022 走看看