目录
格雷编码
-
题目介绍
-
思路分析
- 对于本题而言,我们可以利用数学归纳的思想,假设k位格雷码序列我们是已知的,则k+1位格雷码序列是什么样子的?
- 当我们把k位格雷码序列翻转过来衔接到原来的k位格雷码序列之后时,前边的2的k次幂位和后面2的k次幂位都是符合条件的,这时我们需要处理的是衔接处的两个数字如何处理。
- 根据题目要求,我们可以对后半部分的格雷码序列分别追加1,这样衔接处的两个数字也满足了题目要求且不影响后面的格雷码序列,因为都追加了1。这里具体解释一下:追加1的意思是对某个数字的二进制追加1而不是直接对某个数字加1,举个例子:对2追加1,2的二进制为10,追加1变为110对应的数字为6;4的二进制为100,追加1变为1100对应的数字为12。
- 在位运算中对一个数字k追加1的具体表示方法为:k|1<<i,(i为k的二进制的最高位+1),1<<i的意思为2的i次幂。
-
相关代码片段
class Solution {
public List<Integer> grayCode(int n) {
List<Integer> list = new ArrayList<>();
//格雷码的第一位一定为0
list.add(0);
for(int i = 1; i <= n;i++){
int m = list.size();
//先翻转然后在对翻转后的格雷码序列追加1
for(int j = m-1; j >= 0; j--){
list.add(list.get(j)|1<<(i-1));
}
}
return list;
}
}