89 Gray Code

原创 2015年11月17日 21:50:42

题目链接:https://leetcode.com/problems/gray-code/

题目:

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.

解题思路:
这题的考点是格雷码的编码规则,以及位操作
一开始自己只是就题论题,并没有考虑到格雷码。
思路是:
1. 对每一个二进制数,要在其基础上只变动一位,也就是只对某一位进行变化,由于格雷码的长度为 n ,这样的变化会有 n 种。
2. 通过 n 次变化产生数值,若 list 中没有该数,就将该数添加到 list 中。同时,以本次产生的新数作为下一轮变动的基础。
这样的算法时间复杂度很高。并不是一种好的解决方法。

通过看大神的解答:http://blog.csdn.net/linhuanmars/article/details/24511221
1. n == 1 时,最基本的数字是 0 和 1,将它们加入到 list 中,作为后续变化的基础。
2. 每一次都在已有数字基础上在其前面(最左端)添加数字 1,使原有数字变成一个新的数。(在最左端添加 0 ,并没有改变原有数字) 因为原有数字互不相同,添加 1 后的数字也各不相同。
3. 在 list 中已有数字的基础上,对 list 中的数从后向前遍历,依次对已有的数字(二进制位数为 k)加上比当前数字位数多一位(k + 1 位)的 数——1 左移 k 位。
举例说明:
第一轮:0 1
第二轮:11 10(新添加) | 1 0(已有) 加上 1 左移 1 位
第三轮:111 110 101 100(新添加)| 11 10 1 0 加上 1 左移 2 位
……

代码实现:
第二种思路:

public class Solution {
    public List<Integer> grayCode(int n) {
        List<Integer> list = new ArrayList();
        if(n == 0) {
            list.add(0);
            return list;
        }
        list.add(0);
        list.add(1);
        for(int i = 2; i <= n; i ++) {
            int size = list.size();
            for(int j = size - 1; j >= 0; j --)
                list.add(list.get(j) + (1 << (i - 1)));
        }
        return list;
    }
}
12 / 12 test cases passed.
Status: Accepted
Runtime: 1 ms

第一种思路:

public class Solution {
    public List<Integer> grayCode(int n) {
        int len = (int)Math.pow(2.0, n);
        List<Integer> list = new ArrayList();
        int k = 0;
        while(list.size() < len - 1) {
            for(int i = 0; i < n; i ++) {
                int temp = k ^ (int)Math.pow(2.0, i);
                if(!list.contains(temp)) {
                    list.add(k);
                    k = temp;
                    break;
                }
            }
        }
        list.add(k);
        return list;
    }
}
12 / 12 test cases passed.
Status: Accepted
Runtime: 16 ms
版权声明:本文为博主原创文章,未经博主允许不得转载。

LeetCode(一)关于GrayCode的实现

在LeetCode上面有一道题,是关于Gray Code的实现的。 GrayCode是这样一种编码: 1 位Gray Code : 0 12 位Gray Code: 先添加一个镜像,如下: 0 1 1...
  • foolsheep
  • foolsheep
  • 2014年03月21日 23:02
  • 1320

格雷码Gray Code

http://blog.csdn.net/pipisorry/article/details/72356418格雷码简介  在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格...
  • pipisorry
  • pipisorry
  • 2017年05月18日 11:02
  • 1298

Gray Code 简介及生成

Gray Code 简介及生成
  • Tc_To_Top
  • Tc_To_Top
  • 2015年03月11日 21:05
  • 772

格雷码(gray code)

格雷码是二进制数字系统,
  • bdss58
  • bdss58
  • 2014年09月17日 21:30
  • 434

递归——生成格雷码(gray code)

题目描述 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码。 给定一个整数n,请...
  • jingsuwen1
  • jingsuwen1
  • 2016年08月03日 10:56
  • 533

格雷码(Gray Code)的生成

1、什么是格雷码       Gray Code是一个数列集合,每个数使用二进制来表示,假设使用n位元来表示每个数字,那么任两个数之间只有一个位元值不同。       例如: 生成4位元的格雷码就是:...
  • WCCchangchun
  • WCCchangchun
  • 2016年07月11日 00:36
  • 591

LeetCode题目 Gray Code 的解法与疑问

vector grayCode(int n) { vector Bits(1,0); for(int GrayDigit = 0;GrayDigit { int count = Bits....
  • catsanddogsman
  • catsanddogsman
  • 2014年06月28日 13:29
  • 380

算法学习 - Gray Code(格雷码)的解释和c++实现

Gray Code(格雷码) 典型的二进制格雷码(Binary Gray Code)简称格雷码。当初是为了通信,现在则常用于模拟-数字转换和位置-数字转换中。 特点是:一组数的编码中,若任意两个相...
  • chenfs1992
  • chenfs1992
  • 2014年12月11日 02:23
  • 2745

双端滤波器应用于灰度和彩色图像Bilateral Filtering for Gray and Color Images

Bilateral Filtering for Gray and Color Images   IntroductionThe IdeaThe Gaussian CaseExperiments...
  • GarfieldEr007
  • GarfieldEr007
  • 2016年04月18日 19:17
  • 882

Gray code(hdu5375+异或二进制的规律)

Gray code 2015 Multi-University Training Contest 7 Problem Description The reflected binary code, al...
  • u010579068
  • u010579068
  • 2015年08月11日 23:44
  • 678
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:89 Gray Code
举报原因:
原因补充:

(最多只允许输入30个字)