[LeetCode]Gray Code

题目:Gray Code

给定格雷码的位数,输出所有的格雷码对应的十进制数。

思路:

000 0

001 1

011 3

010 2

110 6

111 7

101 5

100 4

前四个和后四个的前两位对称,前两个和后两个的第一位是对称的。

如此,可看出,格雷码有一定的对称性。

package com.example.medium;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * The gray code is a binary numeral system where two successive values differ in only one bit.
 * 
 * Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.
 * 
 * For example, given n = 2, return [0,1,3,2]. Its gray code sequence is:
 * 
 * 00 - 0
 * 01 - 1
 * 11 - 3
 * 10 - 2
 * Note:
 * For a given n, a gray code sequence is not uniquely defined.
 * 
 * For example, [0,2,3,1] is also a valid gray code sequence according to the above definition.
 * 
 * For now, the judge is able to judge based on one instance of gray code sequence. Sorry about that.
 * @author FuPing
 *
 */
public class GrayCode {
    private void getCode(List<Integer> list,int start,int end,int value){
        if(start == end){//第一个
            list.add(0, 0);
            return;
        }
        int mid = (start + end)/2;
        getCode(list, start, mid, value);//递归求前半部分

        for (int i = mid + 1; i <= end; i++) {//对称性
            list.add(i, list.get(end - i) + (end - start + 1)/2);
        }
    }
    public List<Integer> grayCode(int n) {
        int length = (int)Math.pow(2, n);
        List<Integer> list = new ArrayList<Integer>(length);
        getCode(list, 0, length - 1, 0);

        return list;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(new GrayCode().grayCode(7));

    }

}
class Solution {
public:
    vector<int> grayCode(int n) {
        vector<int> codes;
        getGrayCode(codes, 0, pow(2, n));
        return codes;
    }
private:
    void getGrayCode(vector<int> &grayCodes, int start, int length){
        if (length == 1){
            grayCodes.push_back(0);
            return;
        }
        getGrayCode(grayCodes,0,length/2);
        for (int i = length/2; i < length; i++)
        {
            grayCodes.push_back(grayCodes.at(length - i - 1) + length/2);
        }
    }
};
原文地址:https://www.cnblogs.com/yeqluofwupheng/p/6685599.html