1. 程式人生 > >騰訊//格雷編碼

騰訊//格雷編碼

格雷編碼是一個二進位制數字系統,在該系統中,兩個連續的數值僅有一個位數的差異。

給定一個代表編碼總位數的非負整數 n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。

示例 1:

輸入: 2
輸出: [0,1,3,2]
解釋:
00 - 0
01 - 1
11 - 3
10 - 2

對於給定的 n,其格雷編碼序列並不唯一。
例如,[0,2,3,1] 也是一個有效的格雷編碼序列。

00 - 0
10 - 2
11 - 3
01 - 1

示例 2:

輸入: 0
輸出: [0]
解釋: 我們定義格雷編碼序列必須以 0 開頭。
     給定編碼總位數為 n 的格雷編碼序列,其長度為 2nn = 0 時,長度為 20 = 1。
     因此,當 n
= 0 時,其格雷編碼序列為 [0]。

class Solution {
public:
    
    /*
     * @param n: a number
     * @return: Gray code
     */
    vector<int> grayCode(int n) {
        // write your code here
        if (n <= 0) {
            return vector<int>(1, 0);
        }
 
        vector<string> strs = grayCodeOfString(n);
        vector<int> result;
        for (int i = 0; i < strs.size(); i++) {
            result.push_back(bitStringToInt(strs[i]));
        }
        return result;
    }
 
    vector<string> grayCodeOfString(int n) {
        vector<string> strs(pow(2, n), "");
        if (n == 1) {
            strs[0] = "0";
            strs[1] = "1";
            return strs;
        }
        vector<string> last = grayCodeOfString(n - 1);
 
        for (int i = 0; i < last.size(); i++) {
            strs[i] = "0" + last[i];
            strs[strs.size() - 1 - i] = "1" + last[i];
        }
        return strs;
    }
 
    int bitStringToInt(string str) {
        int result = 0, pow = 1;
        for (int i = str.size() - 1; i >= 0; i--) {
            result += ((str[i] - '0') * pow);
            pow *= 2;
        }
        return result;
    }
};

class Solution {
public:
    
    /*
     * @param n: a number
     * @return: Gray code
     */
    vector<int> grayCode(int n) {
        int size = 1<<n;
        vector<int> res;
        for(int i = 0; i < size; i++){
            int graycode = i^(i>>1);
            res.push_back(graycode);
        }
        return res;
    }
       
};