import java.util.ArrayList; import java.util.List; /** * 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. * * Tags: Backtracking */ class Graycode { public static void main(String[] args) { System.out.println(new Graycode().grayCode(3)); } /** * generate 0, 1 then add 10 from back to get 11, 10 * same goes for 00, 01, 11, 10, add 100 to get 110, 111, 101, 100 */ public List<Integer> grayCode(int n) { List<Integer> results = new ArrayList<Integer>(); results.add(0); // starts from 0 for (int i = 0; i < n; i++) { int inc = 1 << i; // move 1 i times for (int j = results.size() - 1; j >= 0; j--) { // backtracking results.add(results.get(j) + inc); } } return results; } }