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.
解法:
这题的关键在于用什么样的方式把这2^n个数入队列使得任意两个相邻的数只有一个的二进制码只有一位不同。
可以这样考虑:对于已经处理好的n=k-1的情况,2^(k-1)个数已经在队列中,接下来只需从队列末端开始反向遍历该队列并在该数最高位前加一个1再入队列即可满足n=k时的情况。
example:
n=3时,[000,001,011,010,110,111,101,100]
n=4时,[0000,0001,0011,0010,0110,0111,0101,0100, 1100,10101,10111,10110,10010,10011,10001,10000]
于是,在保证初始队列中有一个0后,从n=1开始做上述动作知道n=XX即可。(XX是用户输入的数)
public class Solution {
public List<Integer> grayCode(int n) {
List<Integer> res = new ArrayList<Integer>();
int last = 0;
res.add(last);
for(int i = 1; i <= n; i++){
Integer base = (int) Math.pow(2, i-1);
for(int j = res.size()-1 ; j >= 0; j--){
res.add(res.get(j) + base);
}
}
return res;
}
}