Leetcode算法學習日誌-89 Gray Code

Leetcode 89 Gray Code

題目原文

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

Note:
For a given n, a gray code sequence is not uniquely defined.

For example, [0,2,3,1] is also a valid gray code sequence according to the above definition.

For now, the judge is able to judge based on one instance of gray code sequence. Sorry about that.

題意分析

給定二進制位數n,輸出對應的格雷碼。格雷碼的沒兩個碼字之間只有一位不同。

解法分析

格雷碼有多種,3位典型格雷碼如下:000-001-011-010-110-111-101-100,十進制爲0,1,3,2,6,7,5,4,可以看出,三位的格雷碼可以由兩位格雷碼得到,前一半就是兩位格雷碼,後一半在左邊加了一個1.遞歸方法C++代碼如下:

class Solution {
public:
    vector<int> grayCode(int n) {
        vector<int> res(1,0);
        vector<int> temp;
        if(n==0)
            return res;
        temp=grayCode(n-1);
        res=temp;
        reverse(temp.begin(),temp.end());
        for(auto digit:temp){
            res.push_back((int)pow((double)2,n-1)+digit);
        }
        return res;    
    }
};
本題還有一個巧妙的方法,設格雷碼第i個輸出爲G[i],則G[i]=i^(i>>1),C++代碼如下:

class Solution {
public:
    vector<int> grayCode(int n) {
        vector<int> result;
        
        for(int i=0;i<1<<n;i++){
            result.push_back(i^(i>>1));
        }
        return result;
    }
};
注意1<<n的含義爲將1向右移動三位,相當於8.

發佈了79 篇原創文章 · 獲贊 16 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章