解题思路:
解法一:找规律,2-4位格雷码的码表如下图所示(二进制表示):
可以发现,n位格雷码序列可以由n-1位格雷码序列得到,满足递归规则,具体构造规则如下:
通过上述递归求解出n位格雷码中每一个码字的二进制序列,然后将该二进制序列转为十进制,即所求
AC代码:
- class Solution {
- public static List
grayCode(int n) { - List
result = binGrayCode(n); - List
ans = new ArrayList<>(); - for (String str : result) {
- int num = Integer.parseInt(str, 2);
- ans.add(num);
- }
- return ans;
- }
-
- public static List
binGrayCode(int n){ - ArrayList
result = new ArrayList<>(); - if (n==1){
- result.add("0");
- result.add("1");
- return result;
- }
- List
ans = binGrayCode(n - 1); - for (String an : ans) {
- result.add("0" + an);
- }
- for (int i = ans.size()-1; i >=0; i--) {
- result.add("1"+ans.get(i));
- }
-
- return result;
- }
- }
方法二:公式法:
第i个格雷码等于:
即 i 与 i/2向下取整的异或值
AC代码:
- class Solution {
- public static List
grayCode(int n) { - ArrayList
result = new ArrayList<>(); - for (int i = 0; i < 1 << n; i++) {
- result.add(i ^ (i >> 1));
- }
- return result;
- }
- }