zoukankan      html  css  js  c++  java
  • [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;
        }
    }
  • 相关阅读:
    Win7。56个进程让我头疼
    bzoj2843极地旅行社
    bzoj2751[HAOI2012]容易题(easy)
    bzoj3442学习小组
    bzoj4423[AMPPZ2013]Bytehattan
    bzoj4591[Shoi2015]超能粒子炮·改
    bzoj2299[HAOI2011]向量
    bzoj3223Tyvj 1729 文艺平衡树
    bzoj2563阿狸和桃子的游戏
    bzoj3673可持久化并查集 by zky&&bzoj3674可持久化并查集加强版
  • 原文地址:https://www.cnblogs.com/airwindow/p/4230045.html
Copyright © 2011-2022 走看看