騰訊//格雷編碼
阿新 • • 發佈:2018-12-25
格雷編碼是一個二進位制數字系統,在該系統中,兩個連續的數值僅有一個位數的差異。
給定一個代表編碼總位數的非負整數 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 的格雷編碼序列,其長度為 2n
。當 n = 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; } };