标签:
The problem:
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.
My analysis:
The solution behind is problem is very tricky, but elegant. The wiki link for the solution: http://zh.wikipedia.org/wiki/格雷码#mediaviewer/File:Binary-reflected_Gray_code_construction.svg The key idea: n‘s Gray code collection could be infered from n-1‘s gray code by following way: 1. first, we add ‘0‘ at the front of all gray code of n-1. Since the ‘0‘ would not change the value of the gray code, we could just keep the n-1‘s gray integer. 2. Second, we reverse the n-1‘s gray code collection, and add ‘1‘ at the front of all gray code of n-1. The method is very tricky, since the reverse can guarantee the two middle elements have the same gray code series. 00 000 01 001 10 010 11 <--- the same 011 <--- prefix: 0 11 <--- the same 111 <--- prefix: 1 10 110 01 101 00 100 What a tricky method!!! The code for this is : for (int i = 2; i <= n; i++) { for (int j = ret.size() - 1; j >= 0; j--) { ret.add(ret.get(j) + (1 << i - 1)); } } Facts: 1. we won‘t delete the n-1‘s gray Iteger. 2. we scan the ArrayList from the end to the start. A little skill: How to get the interger value of n digits, and only the nth digit‘s value is 1, other‘s are 0. 9 digits: 100000000 1 << 8 n digits: 1 << n - 1 (This is a very important skill!!!not 1 << n).
My solution:
public class Solution { public List<Integer> grayCode(int n) { ArrayList<Integer> ret = new ArrayList<Integer> (); if (n < 0 || n > 32) return ret; if (n == 0) { ret.add(0); return ret; } ret.add(0); ret.add(1); for (int i = 2; i <= n; i++) { for (int j = ret.size() - 1; j >= 0; j--) { ret.add(ret.get(j) + (1 << i - 1)); } } return ret; } }
标签:
原文地址:http://www.cnblogs.com/airwindow/p/4230045.html