【leetcode】Gray Code
2014-09-14 11:07
190 查看
题目:
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
gray code sequence is:
Note:
For a given n, a gray code sequence is not uniquely defined.
For example,
to the above definition.
For now, the judge is able to judge based on one instance of gray code sequence. Sorry about that.
思路:
这是一道非常有意思的题。初看无下手之处,不过列举出前几项就很容易看出规律啦:
n = 1时:
0 (0)
1 (1)
n = 2时:
00 (0)
01 (1)
11 (3)
10 (2)
n = 3时:
000 (0)
001 (1)
011 (3)
010 (2)
110 (6)
111 (7)
101 (5)
100 (4)
可看出n每增加一位,结果数量翻倍,且前一半和n-1的结果是一样的,而后一半其实就是前半部分的镜像对称,再在最高位加上1.
所以完全可以用递归,通过n-1得到n的结果。代码如下:
public List<Integer> grayCode(int n) {
List<Integer> result = new ArrayList<Integer>();
if(n<=1) {
for(int i =0; i<=n; i++) {
result.add(i);
}
return result;
}
result = grayCode(n-1);
List<Integer> r1 = reverse(result);
int x = 1<<(n-1);
for(int i = 0; i< r1.size(); i++) {
r1.set(i, r1.get(i)+x);
}
result.addAll(r1);
return result;
}
public List<Integer> reverse(ArrayList<Integer> r) {
List<Integer> result = new ArrayList<Integer>();
for(int i = r.size()-1; i>=0; i--) {
result.add(r.get(i));
}
return result;
}
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.
思路:
这是一道非常有意思的题。初看无下手之处,不过列举出前几项就很容易看出规律啦:
n = 1时:
0 (0)
1 (1)
n = 2时:
00 (0)
01 (1)
11 (3)
10 (2)
n = 3时:
000 (0)
001 (1)
011 (3)
010 (2)
110 (6)
111 (7)
101 (5)
100 (4)
可看出n每增加一位,结果数量翻倍,且前一半和n-1的结果是一样的,而后一半其实就是前半部分的镜像对称,再在最高位加上1.
所以完全可以用递归,通过n-1得到n的结果。代码如下:
public List<Integer> grayCode(int n) {
List<Integer> result = new ArrayList<Integer>();
if(n<=1) {
for(int i =0; i<=n; i++) {
result.add(i);
}
return result;
}
result = grayCode(n-1);
List<Integer> r1 = reverse(result);
int x = 1<<(n-1);
for(int i = 0; i< r1.size(); i++) {
r1.set(i, r1.get(i)+x);
}
result.addAll(r1);
return result;
}
public List<Integer> reverse(ArrayList<Integer> r) {
List<Integer> result = new ArrayList<Integer>();
for(int i = r.size()-1; i>=0; i--) {
result.add(r.get(i));
}
return result;
}
相关文章推荐
- Leetcode88: Gray Code
- Java for LeetCode 089 Gray Code
- [leetcode] 89. Gray Code 解题报告
- leetcode 89:Gray Code
- leetcode Gray Code
- leetcode题解-89. Gray Code
- LeetCode 89. Gray Code(格雷码)
- leetcode 89:Gray Code
- Gray Code [leetcode]
- [leetcode]Gray Code
- [leetcode]Gray Code
- LeetCode 89: Gray Code 格雷码
- [leetcode]Gray Code
- LeetCode之Gray Code
- leetcode89~Gray Code
- LeetCode | 89. Gray Code
- Gray Code (格雷码编码) 【leetcode】
- [Leetcode]Gray Code
- leetcode 日经贴,Cpp code -Gray Code
- LeetCode | Gray Code(格雷码)