• [LeetCode#89]Gray Code


    The problem:

    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.

    My analysis:

    The solution behind is problem is very tricky, but elegant. 
    The wiki link for the solution:
    http://zh.wikipedia.org/wiki/格雷码#mediaviewer/File:Binary-reflected_Gray_code_construction.svg
    The key idea: 
    n's Gray code collection could be infered from n-1's gray code by following way:
    1. first, we add '0' at the front of all gray code of n-1.
    Since the '0' would not change the value of the gray code, we could just keep the n-1's gray integer.
    
    2. Second, we reverse the n-1's gray code collection, and add '1' at the front of all gray code of n-1.
    The method is very tricky, since the reverse can guarantee the two middle elements have the same gray code series.
    00                      000
    01                      001
    10                      010
    11 <--- the same        011 <--- prefix: 0
    11 <--- the same        111 <--- prefix: 1
    10                      110
    01                      101
    00                      100
    What a tricky method!!!
    The code for this is :
    for (int i = 2; i <= n; i++) {
        for (int j = ret.size() - 1; j >= 0; j--) {
            ret.add(ret.get(j) + (1 << i - 1));
        }
    }
    Facts:
    1. we won't delete the n-1's gray Iteger.
    2. we scan the ArrayList from the end to the start.
    
    A little skill:
    How to get the interger value of n digits, and only the nth digit's value is 1, other's are 0.
    9 digits: 100000000   1 << 8
    n digits: 1 << n - 1 (This is a very important skill!!!not 1 << n).

    My solution:

    public class Solution {
        public List<Integer> grayCode(int n) {
            ArrayList<Integer> ret = new ArrayList<Integer> ();
            if (n < 0 || n > 32)
                return ret;
            if (n == 0) {
                ret.add(0);
                return ret;
            }
            ret.add(0);
            ret.add(1);
            for (int i = 2; i <= n; i++) {
                for (int j = ret.size() - 1; j >= 0; j--) {
                    ret.add(ret.get(j) + (1 << i - 1));
                }
            }
            return ret;
        }
    }
  • 相关阅读:
    IP查询网和traceroute找到的网络出口不一致的原因
    [转载] 深入理解VMware虚拟机网络通信原理
    https工作流程
    HTTP1.1协议-RFC2616-中文版
    条件变量调用Signal的时候是否需要持有mutex
    HTTP Get一定是幂等的吗,统计访问量的时候呢?
    unix网络编程
    MySQL-SQL基础-DCL
    MySQL-SQL基础-查询1
    MySQL-SQL基础-子查询
  • 原文地址:https://www.cnblogs.com/airwindow/p/4230045.html
Copyright © 2020-2023  润新知