[LeetCode][JavaScript]Gray Code
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.
For example, given n = 2, return [0,1,3,2]
. Its gray code sequence is:
00 - 0 01 - 1 11 - 3 10 - 2
Note:
For a given n, a gray code sequence is not uniquely defined.
For example, [0,2,3,1]
is also a valid gray code sequence according to the above definition.
For now, the judge is able to judge based on one instance of gray code sequence. Sorry about that.
https://leetcode.com/problems/gray-code/
直接用格雷码转换的公式,右移一位与自身异或。
使用dfs得到符合题意的答案,但答案只接受格雷码的顺序,而且大数据用dfs会超时。
1 /** 2 * @param {number} n 3 * @return {number[]} 4 */ 5 var grayCode = function(n) { 6 var len = Math.pow(2, n), res = []; 7 for(var i = 0; i < len; i++) 8 res.push(i ^ (i >> 1)); 9 return res; 10 }
DFS,顺序不对不能AC。
1 /** 2 * @param {number} n 3 * @return {number[]} 4 */ 5 var grayCode_WA = function(n) { 6 if(n === 0) return [0]; 7 var i, map = [], visited = {}, len = Math.pow(2, n); 8 for(i = 0; i < n; i++) 9 map[i] = 0; 10 visited[map.join("")] = true; 11 return dfs(map, [0]); 12 13 function dfs(map, res){ 14 if(res.length === len) 15 return res; 16 var key = "", tmp; 17 for(var i = 0; i < n; i++){ 18 map[i] === 0 ? map[i] = 1 : map[i] = 0; 19 key = map.join(""); 20 if(!visited[key]){ 21 visited[key] = true; 22 res.push(parseInt(key, 2)); 23 tmp = dfs(map, res); 24 if(tmp) return tmp; 25 res.pop(); 26 visited[key] = false; 27 } 28 map[i] === 0 ? map[i] = 1 : map[i] = 0; 29 } 30 return false; 31 } 32 };