问题概述:
在一组数的编码中,若随意两个相邻的代码仅仅有一位二进制数不同。则称这样的编码为格雷码。

2位数的格雷码序列:
00 : 0
01 : 1
11 : 3
10 : 2
找规律:
假设要求n位的格雷码,先要求出n-1位的格雷码。

循环上一次格雷码的每一位,都会生成两个新的格雷码: 
统计'1'出现的次数
假设为偶数: 两个新格雷码分别为xxx1和xxx0
假设为奇数: 两个新格雷码分别为xxx0和xxx1

以3位格雷码为例:

由00得:
000 = 00+(0)
001 = 00+(1)

由01得:
011 = 01+(1)
010 = 01+(0)

由11得:
110 = 11+(0)
111 = 11+(1)

由10得:
101 = 10+(1)
100 = 10+(0)

然后把新格雷码加入到序列用于下一次格雷码序列的计算。

实现代码:

public class Solution {
public IList<int> GrayCode(int n) {
if(n < 0){
return new List<int>();
}
if(n == 0){
return new List<int>{0};
}
if(n == 1){
return new List<int>(){0,1};
}
if(n == 2){
return new List<int>{0,1,3,2};
} var r = new List<string>(){"00","01","11","10"};
for(var i = 3;i <= n; i++){
var tmp = new List<string>();
for(var j = 0;j < r.Count; j++){
var countOne = 0;
foreach(var c in r[j]){
if(c == '1'){
countOne ++;
}
}
if(countOne % 2 == 0){
tmp.Add(r[j]+"0");
tmp.Add(r[j]+"1");
}
else{
tmp.Add(r[j]+"1");
tmp.Add(r[j]+"0");
}
}
r = tmp;
} var ret = new List<int>();
foreach(var s in r){
var num = Convert.ToInt32(s,2);
ret.Add(num);
} return ret; }
}

LeetCode 格雷码序列的生成的更多相关文章

  1. C语言输出格雷码

    格雷码是以n位的二进制来表示数. 与普通的二进制表示不同的是,它要求相邻两个数字只能有1个数位不同. 首尾两个数字也要求只有1位之差. 有很多算法来生成格雷码.以下是较常见的一种: 从编码全0开始生成 ...

  2. 构建n位元的格雷码

    二进制格雷码的生成 1.什么是格雷码 Gray Code是一个数列集合,每个数使用二进制来表示,假设使用n位元来表示每个数字,那么任两个数之间只有一个位元值不同.log2(16)=4 例如: 生成4位 ...

  3. 求解n位格雷码

    /************************************************************************* > File Name: Gray.cpp ...

  4. [LeetCode] Gray Code 格雷码

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

  5. 解题(GeLeiMa -生成格雷码)

    题目描述 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码. 给定一个整数n,请返回n位的格雷码 ...

  6. [LeetCode] 89. Gray Code 格雷码

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

  7. 格雷码(Grey Code)生成规则

    (1) Grey码在FPGA实际应用中是实用的码,在8421BCD码累加计数器中,如果寄存器需要发生多位(两位或者以上)的跳变,会出现中间态,这样作为组合逻辑的输入是不稳妥的. 下面看两个中间态的例子 ...

  8. LeetCode:Gray Code(格雷码)

    题目链接 The gray code is a binary numeral system where two successive values differ in only one bit. Gi ...

  9. leetCode 89.Gray Code (格雷码) 解题思路和方法

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

随机推荐

  1. P1162 填涂颜色 洛谷

    题目描述 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和涂色后的方阵如下: 0 ...

  2. 找礼物(find)(模拟)

    找礼物(find) 时间限制: 1 Sec  内存限制: 64 MB提交: 57  解决: 4[提交][状态][讨论版] 题目描述 新 年到了,你的好友和你(共K个人)的周围满是礼物,你让你的好友先拿 ...

  3. 12、Django实战第12天:课程机构列表页数据展示

    今天完成的是课程机构列表页.... 1.启动服务,进入xadmin后,添加5个城市信息用作测试数据 2.添加课程机构,其中有一项要上传封面图的地方要注意 封面图上传路径是我们在models中设置好的 ...

  4. 【Android】自定义View

    内置组件经常不满足我们的需求,那么就要自己来重写了,一般需要实现以下几个父类方法: 1.onMeasure 决定内部View的宽和高,以及自身的宽和高 2.onLayout 决定子View的放置位置 ...

  5. csdn下载频道 循环登录的解决方法

    一直循环登录,明明登录成功,跳转页面后还是无法下载,还是要登录,一直循环. 解决方法是修改密码.看来asp果然是垃圾啊.

  6. 【Heap-Dijkstra】【分层图】bzoj2763 [JLOI2011]飞行路线

    建立k+1张图, 在图与图之间,若在原图中x到y有边,就建立从 第i层的x 到 i+1层的y 建边,权值为0.代表一次免费机会. 由于一旦到了第i+1层的图里,则无法回到之前的层,所以免费最多只有k次 ...

  7. Exercise02_01

    import java.util.Scanner; public class Out { public static void main(String[] args){ Scanner input = ...

  8. nginx+php-fpm 报错Primary script unknown

    报错信息(nginx日志): // :: [crit] #: * stat() : Permission denied), client: 172.21.205.25, server: localho ...

  9. 如何设断点????-----使用WinDbg调试SQL Server查询

    http://www.cnblogs.com/woodytu/p/4665427.html http://www.sqlservercentral.com/blogs/aschenbrenner/20 ...

  10. REST和SOAP区别

     转载于: http://blog.csdn.net/idafish/article/details/6308916 REST似乎在一夜间兴起了,这可能引起一些争议,反对者可以说REST是WEB诞生之 ...