An n-bit gray code sequence is a sequence of 2n
integers where:
[0, 2n - 1]
,0
,Given an integer n
, return any valid n-bit gray code sequence.
Example 1:
Input: n = 2 Output: [0,1,3,2] Explanation: The binary representation of [0,1,3,2] is [00,01,11,10]. - 00 and 01 differ by one bit - 01 and 11 differ by one bit - 11 and 10 differ by one bit - 10 and 00 differ by one bit [0,2,3,1] is also a valid gray code sequence, whose binary representation is [00,10,11,01]. - 00 and 10 differ by one bit - 10 and 11 differ by one bit - 11 and 01 differ by one bit - 01 and 00 differ by one bit
Example 2:
Input: n = 1 Output: [0,1]
Constraints:
1 <= n <= 16
This problem asks to generate a Gray code sequence of length 2n, where n is the input integer. A Gray code is a binary numeral system where two successive values differ in only one bit.
The most efficient approach leverages the direct mathematical relationship between a binary number and its Gray code equivalent. The Gray code G
of a binary number B
can be calculated using the formula:
G = B ^ (B >> 1)
where ^
represents the bitwise XOR operation and >>
is the right bit shift. This formula efficiently converts a binary number to its Gray code equivalent.
G = B ^ (B >> 1)
to obtain its Gray code.The following code implementations demonstrate the solution in various programming languages:
class Solution:
def grayCode(self, n: int) -> List[int]:
return [i ^ (i >> 1) for i in range(1 << n)]
import java.util.ArrayList;
import java.util.List;
class Solution {
public List<Integer> grayCode(int n) {
List<Integer> ans = new ArrayList<>();
for (int i = 0; i < (1 << n); ++i) {
ans.add(i ^ (i >> 1));
}
return ans;
}
}
#include <vector>
class Solution {
public:
std::vector<int> grayCode(int n) {
std::vector<int> ans;
for (int i = 0; i < (1 << n); ++i) {
ans.push_back(i ^ (i >> 1));
}
return ans;
}
};
func grayCode(n int) []int {
result := make([]int, 1<<n)
for i := 0; i < 1<<n; i++ {
result[i] = i ^ (i >> 1)
}
return result
}
/**
* @param {number} n
* @return {number[]}
*/
var grayCode = function(n) {
let result = [];
for (let i = 0; i < (1 << n); i++) {
result.push(i ^ (i >> 1));
}
return result;
};
All these implementations follow the same core algorithm, providing a concise and efficient solution to generate the Gray code sequence. They differ only in syntax and specific language features.