当前位置: 首页 > news >正文

LeetCode 格雷码序列的生成

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


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 -- 反转英文单词
  • XACT QA
  • LeetCode -- 最大连续乘积子序列
  • 重新安家,很不幸 kamang域名忘记续费了。
  • Leet Code -- Unique BST
  • LeetCode -- 判断链表中是否有环
  • oms和android在开发上有什么不同?
  • LeetCode -- house robber
  • [IE编程] 多页面基于IE内核浏览器的代码示例
  • LeetCode -- 求字符串数组中的最长公共前缀
  • 怎样写 Linux LCD 驱动程序
  • LeetCode -- 帕斯卡三角形
  • SQL2005CLR函数扩展-正则表达式
  • LeetCode - Merge Intervals
  • LeetCode -- Three Sum
  • Angular 响应式表单 基础例子
  • CAP 一致性协议及应用解析
  • docker容器内的网络抓包
  • ERLANG 网工修炼笔记 ---- UDP
  • Fundebug计费标准解释:事件数是如何定义的?
  • JAVA之继承和多态
  • Material Design
  • Python socket服务器端、客户端传送信息
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • ubuntu 下nginx安装 并支持https协议
  • 如何胜任知名企业的商业数据分析师?
  • 用mpvue开发微信小程序
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # 数论-逆元
  • #{}和${}的区别?
  • #Linux(Source Insight安装及工程建立)
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (ibm)Java 语言的 XPath API
  • (翻译)terry crowley: 写给程序员
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (九)One-Wire总线-DS18B20
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转载)虚函数剖析
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .net core 依赖注入的基本用发
  • .net 流——流的类型体系简单介绍
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .Net(C#)常用转换byte转uint32、byte转float等
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @media screen 针对不同移动设备
  • [@Controller]4 详解@ModelAttribute
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [BSGS算法]纯水斐波那契数列
  • [ffmpeg] av_opt_set 解析
  • [FFmpeg学习]从视频中获取图片
  • [Go WebSocket] 多房间的聊天室(三)自动清理无人房间
  • [GPT]Andrej Karpathy微软Build大会GPT演讲(上)--GPT如何训练