【leetcode】Gray Code (middle)
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
思路: Gray Code的意思就是n位的二进制序列,相邻两个只有一位不同。观察
000 - 0 001 - 1 011 - 3 010 - 2
110 - 6
111 - 7
101 - 5
100 - 4
第0位的序列为 01 10 01 这样不断重复
第1位的序列为 0011 1100
第2位的序列为 11110000
这样我们就找到了规律。
我最开始是通过判段每次是第几位变化,通过异或得到新值。 每次第k为变化时满足 i = 2k + n*2(k+1)
vector<int> grayCode(int n) { vector<int> ans; ans.push_back(0); if(n == 0) return ans; for(int i = 1; i < (1 << n); i++) { int bit_change = 0; for(int j = 0; j < n; j++) { if(i % (1 << (j + 1)) - (1 << j) == 0) { bit_change = j; break; } } int cur = (1 << bit_change); cur ^= ans.back(); ans.push_back(cur); } return ans; }
后来看其他人的发现更简单的方法
vector<int> grayCode2(int n) { vector<int> ans; ans.push_back(0); if(n == 0) return ans; for(int i = 0; i < n; i++) { int inc = 1 << i; for(int j = ans.size() - 1; j >= 0; j--) //每次等第i - 1位正反序都存完毕时,第i位起始为0的情况也存储完了, 只需存储第i位起始为1并且低位倒序输出 { ans.push_back(ans[j] + inc); } } return ans; }