[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.
Example 1:
Input: 2
Output: [0,1,3,2]
Explanation:
00 - 0
01 - 1
11 - 3
10 - 2
For a given n, a gray code sequence may not be uniquely defined.
For example, [0,2,3,1] is also a valid gray code sequence.
00 - 0
10 - 2
11 - 3
01 - 1
Example 2:
Input: 0
Output: [0]
Explanation: We define the gray code sequence to begin with 0.
A gray sequence of n has size = 2n, which for n = 0 the size is 20 = 1.
Therefore, for n = 0 the gray code sequence is [0].
首先要清楚什么是格雷码,然后用位操作来处理。
Java:
public List<Integer> grayCode(int n) { List<Integer> result = new LinkedList<>(); for (int i = 0; i < 1<<n; i++) result.add(i ^ i>>1); return result; }
Java:
public List<Integer> grayCode(int n) { List<Integer> rs=new ArrayList<Integer>(); rs.add(0); for(int i=0;i<n;i++){ int size=rs.size(); for(int k=size-1;k>=0;k--) rs.add(rs.get(k) | 1<<i); } return rs; }
Python:
class Solution(object): def grayCode(self, n): """ :type n: int :rtype: List[int] """ result = [0] for i in xrange(n): for n in reversed(result): result.append(1 << i | n) return result
Python:
# Proof of closed form formula could be found here: # http://math.stackexchange.com/questions/425894/proof-of-closed-form-formula-to-convert-a-binary-number-to-its-gray-code class Solution2(object): def grayCode(self, n): """ :type n: int :rtype: List[int] """ return [i >> 1 ^ i for i in xrange(1 << n)]
C++:
// Time: (2^n) // Space: O(1) class Solution { public: vector<int> grayCode(int n) { vector<int> result = {0}; for (int i = 0; i < n; ++i) { for (int j = result.size() - 1; j >= 0; --j) { result.emplace_back(1 << i | result[j]); } } return result; } };
C++:
// Time: (2^n) // Space: O(1) // Proof of closed form formula could be found here: // http://math.stackexchange.com/questions/425894/proof-of-closed-form-formula-to-convert-a-binary-number-to-its-gray-code class Solution2 { public: vector<int> grayCode(int n) { vector<int> result; for (int i = 0; i < 1 << n; ++i) { result.emplace_back(i >> 1 ^ i); } return result; } };