Leetcode--Java--89. 格雷编码

题目描述

格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。

给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。即使有多个不同答案,你也只需要返回其中一种。

格雷编码序列必须以 0 开头。

样例描述

示例 1:

输入: 2
输出: [0,1,3,2]
解释:
00 - 0
01 - 1
11 - 3
10 - 2

对于给定的 n,其格雷编码序列并不唯一。
例如,[0,2,3,1] 也是一个有效的格雷编码序列。

00 - 0
10 - 2
11 - 3
01 - 1

思路

找规律:轴对称翻转 + 前一半补0后一般补1

  1. 思维具有跳跃性,画图更加明显。
    Leetcode--Java--89. 格雷编码_第1张图片
  2. 0和1位的情况特殊判断即可。
  3. 推广到k位的情况,
    Leetcode--Java--89. 格雷编码_第2张图片
  4. 前一半数后面补0相当于乘以2,补1相当于乘以2再加1。

代码

class Solution {
    public List<Integer> grayCode(int n) {
     List<Integer> res = new ArrayList<>();
     res.add(0);
     //循环n - 1次
     while (n != 0) {
         for (int i = res.size() - 1; i >= 0 ; i -- ) {
             int t = res.get(i);
             //前一半数左移扩大两倍
             res.set(i, t << 1);
             //后一半数补1就是乘2后加一,再补进答案集
             res.add((t << 1) + 1);
         }
         n --;
     }
    return res;
    }
}

你可能感兴趣的:(Leetcode,格雷码,找规律,轴对称,补0补1)