/*
89. Gray Code
Total Accepted: 57721 Total Submissions: 160293 Difficulty: Medium
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.
Hide Company Tags Amazon
Hide Tags Backtracking
*/
import java.util.*;
public class GrayCode_88 {
public static void main(String[] args) {
int n = 2;
System.out.print(grayCode(n));
n=3;
System.out.print(grayCode(n));
}
public static List<Integer> grayCode(int n) {
// ref: https://leetcode.com/discuss/24634/an-accepted-three-line-solution-in-java
List<Integer> res = new LinkedList<>();
for (int i = 0; i < 1<<n; i++)
res.add(i ^ i>>1);
return res;
}
/*
The purpose of this function is to convert an unsigned
binary number to reflected binary Gray code.
The operator >> is shift right. The operator ^ is exclusive or.
*/
int binaryToGray( int num)
{
return (num >> 1) ^ num;
}
/*
The purpose of this function is to convert a reflected binary
Gray code number to a binary number.
*/
int grayToBinary( int num)
{
int mask;
for (mask = num >> 1; mask != 0; mask = mask >> 1)
{
num = num ^ mask;
}
return num;
}
public static List<Integer> grayCode_sol2(int n) {
// ref: https://leetcode.com/discuss/10068/share-my-solution
/*
My idea is to generate the sequence iteratively. For example, when n=3, we can get the result based on n=2. 00,01,11,10 -> (000,001,011,010 ) (110,111,101,100). The middle two numbers only differ at their highest bit, while the rest numbers of part two are exactly symmetric of part one. It is easy to see its correctness. Code is simple:
*/
List<Integer> res = new ArrayList<>();
res.add(0);
for (int i = 0; i < n; i++) {
int size = res.size();
for (int k = size -1; k >= 0; k--) {
res.add(res.get(k) | 1 << i);
System.out.print(res); // [0, 1][0, 1, 3][0, 1, 3, 2]
}
}
return res;
}
}
89. Gray Code
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 一、题目 二、解题 Gray Code:格雷码 题目的意思是在给出一个字节长度n,生成一个序列,这个序列的要求是格...