google电面第一轮碰到的题.

GrayCode:给定位数n,按规律生成一组二进制代码,直接上例子。

clipboard.png

1位的格雷码就是0,1。
2位的格雷码是在1位的格雷码前面加0或1。
由上图可以发现,2位的格雷码后一位是镜像对称;3位的格雷码后2位是镜像对称;4位的格雷码后3位是镜像对称。
规律就是n为格雷码是在n-1位格雷码的基础上,先将n-1位镜像对称然后前一半首位添0,后一般首位添1而得到。
如果要输出n位的格雷码就得先生成n-1位格雷码,这样自然会想到回溯的方法来编程。
具体实现要先考虑基本的case,也就是n=1的情况,应该先在list中添加0,1两个数,之后n=2的时候倒着读加上1。

public List<Integer> grayCode(int n) {
    if(n == 0){
        List<Integer> res = new ArrayList<>();
        res.add(0);
        return res;
    }
    
    List<Integer> res = grayCode(n-1);
    
    int originSize = res.size();
    int addN = 1 << (n-1);
    
    for(int i = originSize-1;i>=0;i--)
        res.add(addN+res.get(i));
    
    return res;
}

Ref: 百度百科:格雷码


KirkBai
27 声望6 粉丝