Gray Code

来源:互联网 发布:猎豹软件官网 编辑:程序博客网 时间:2024/05/21 17:46

http://blog.csdn.net/sbitswc/article/details/20110655

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 - 001 - 111 - 310 - 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.


HINT(from internet):

The tricky part of this question is to recognize the recursive structure here. For n = 0, sol = [0], that’s the base case. For recursive step, let’s take n = 2 and n = 3 as examples. n = 2, sol = [0, 1, 3, 2]; n = 3, sol = [0, 1, 3, 2, 6, 7, 5, 4]. Look at these two solutions, we see when n = 3, we add 4 more elements [6, 7, 5, 4] and they are just [2+4, 3+4, 1+4, 0+4]. That is sol(n+1) = sol(n) + [ reverse(sol(n)) + 2^(n) ].

学过格雷码的童鞋应该比较好理解,比如n=3时

000

001

011

010

110

111

101

100

规律是 将格雷码看成是上下两部分 n=1 

上 0  下 1

n=2

上为n=1时的格雷码 

下为n=1时的格雷码的倒序再加上最前面的1


public class Solution {    public ArrayList<Integer> grayCode(int n) {        ArrayList<Integer> res = new ArrayList<Integer>();        res.add(0);        for(int i = 0; i < n; i++){            int size = res.size();             for(int k=size; k>0;k--){                res.add(res.get(k-1) + (1<<i));            }                     }        return res;             }}




0 0
原创粉丝点击