我们不妨从简单例子开始进一步看一下什么是格雷码,假设n代表格雷码的位数,当n=1时,我们只有两种选择( 0, 1); 当 n =2 时,格雷码为( 00, 01, 11, 10); 当n = 3时,格雷码为( 000, 001, 011,010, 110, 111, 101, 100);我们发现了一个规律,就是每当增加一位,新的格雷码的前半段都是在之前的格雷码前面加上一个零,红色地方代表了格雷码的前半段。而后半段就是从后面开始在前面加上1。通过这种方式就可以写出任意位数的格雷码。
leetcode中有一道题目是关于格雷码的,在这里列举一下。给定一个整数n,输出它的格雷码序列。格雷码序列不唯一,输出一种就可以。按照上面的编码规则,我们不难写出代码,代码如下:
public class Solution { public List<Integer> grayCode(int n) { List<Integer> list = new ArrayList<Integer>(); if(n < 0) return list; list.add(0); for(int i = 1; i <= n; i++) for(int j = list.size() - 1; j >= 0; j--) { list.add(list.get(j) + (int)Math.pow(2, i - 1)); } return list; } }