LeetCode(一)关于GrayCode的实现

格雷码编码程序 格雷码的快速编码程序,算法经过优化,实现起来十分迅速 立即下载

在LeetCode上面有一道题,是关于Gray Code的实现的。

GrayCode是这样一种编码:

1 位Gray Code :

0
1
2 位Gray Code:

先添加一个镜像,如下:

0
1
1
0
然后,在原来的编码前面添加“0”,在镜像码前面添加“1”,如下:

00
01
11
10
而从2位变化到3位的Gray Code的实现方式跟从1位变化到2位的过程是一样的, 都是先添加镜像码,再分别添加 “0” 和 “1”,然后,。。。

题目的要求是:

Q:给出一个n

A:输出格雷码序列的十进制,上面2位的格雷码,有00,01,11,10,那么就要输出0,1,3,2。

第一想法就是,先照着Gray Code的定义写出来,再将其变成十进制不就好了吗,于是写吧。

	private ArrayList<Integer> grayCode(int n) {
		if (n == 0) {
			ArrayList<Integer> templist = new ArrayList<>(1);
			templist.add(0);
			return templist;
		}
		int length = 1 << n;
		ArrayList<Integer> list = new ArrayList<>(length);
		String[] numbers = new String[length];
		int k = 2;
		numbers[0] = "0";
		numbers[1] = "1";
		while (k <= n) {
			int mid = 1 << (k - 1);
			for (int i = 0; i < mid; i++) {
				numbers[mid + i] = "1" + numbers[mid - i - 1];
				numbers[mid - i - 1] = "0" + numbers[mid - i - 1];
			}
			k++;
		}
		for (CharSequence number : numbers) {
			int value = 0;
			int len = number.length();
			for (int i = 0; i < len; i++) {
				int val = (int) (number.charAt(i) - '0');
				value += val * (1 << (len - i - 1));
			}
			list.add(value);
		}
		return list;
	}

简单说一下思路:

1)如果是0,那么就直接返回一个包含“0”的list。

2)如果大于0,那么先将数组的前两个元素先置成0,1,这是最基本的两个元素。

3)接下来,按照GrayCode的定义,为这两个元素添加镜像码,本来应该是下面这样的变成镜像码:

numbers[mid + i] = numbers[mid - i - 1];
不过考虑到镜像码前面会添加“1”,那么就直接在这一步实现就好了,所以就是上面的代码了。

4)格雷码实现好了,将它变成十进制的数值,然后放到list,返回。


提交,是可以通过的。不过接着仔细一想,自己果然是傻的呀,题目的要求只是要输出十进制的数值,干嘛要用字符串呢,于是琢磨着琢磨着,就想出了下面的方法:

	private ArrayList<Integer> grayCode2(int n) {
		int length = 1 << n;
		ArrayList<Integer> list = new ArrayList<>(length);
		list.add(0);
		if (n > 0) {
			list.add(1);
			int k = 2;
			while (k <= n) {
				int mid = 1 << (k - 1);
				for (int i = 0; i < mid; i++) {
					list.add(mid + i, mid + list.get(mid - i - 1));
				}
				k++;
			}
		}
		return list;
	}

在这个方法中,不用字符串,直接用整数来处理。

1)第一步,先添加一个0,然后判断n的值,如果n > 0,则继续下去算。

2)如果n > 1,那么第二个Gray Code的值一定是1,所以就直接添加1。

3)对于n >=2 的情况,则可以分成两种情况,每次添加镜像码的时候,在镜像码前面添加“1”,而在原来的Gray Code前面添加"0",那么可以发现,前半部分的格雷码,它们的值其实是不变的!其实根本没有必要处理它!我这是多么笨才想到这的啊!

而对于后半部分,前面添加1,其实就是加上一个相对应位数的值,比如3(n)位Gray Code的第 2(k)位(从低往高数),就是添加2 ^ (k-1) = 2,它的另外的实现方式则是 

1 <<(k - 1),而这个值,刚好在上面其实就算出来了,所以就直接用就好了,这样一来,就直接将GrayCode的十进制数值给求出来了。

一测试,通过!

但是,后来在网上看到别人的实现,如下:

	private ArrayList<Integer> grayCode3(int n) {
		int length = 1 << n;
		ArrayList<Integer> list = new ArrayList<>(length);
		for (int i = 0; i < length; i++) {
			list.add((i >> 1) ^ i);
		}
		return list;
	}

突然发现,自己真的是不适合干这行,太笨了!

从零开始:用LabVIEW和ModbusTCP协议,像搭积木一样连接Delta PLC 本文详细介绍了如何利用LabVIEW的图形化编程环境和ModbusTCP工业协议,快速连接Delta PLC实现数据通信。通过模块化配置和实战案例,指导读者无需编写复杂代码即可完成寄存器读取、多数据类型处理及系统监控,显著提升工业自动化项目的开发效率与部署速度。 阅读详情

相关推荐

PADS VX2.7学习记录06-PADS Router软件功能操作

PADS VX2.7学习记录06-PADS Router软件功能操作

qq_31444421的博客 7860

Gray Code

题目名称 Gray Code—LeetCode链接描述 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 cod

715

DCN交换机通过boot模式升级

LIC导入成功后,输入enable进入特权模式,把网线接到通讯网口上,配置好对应interface vlan地址,在enable模式用 copy tftp://x.x.x.x/xxxxxx_nos.img nos.img待提示write ok时,reload设备完成升级。交换机启动后,在显示以下信息时输入“Ctrl+B”,一定得是手动按“Ctrl+B”进入的boot模式才能正常升级。升级交换机成功,在BootROM模式下,执行命令run或reboot,回到CLI配置界面。# 交换机通过boot模式升级。

m0_72501865的博客 946

C语言实现Gray码生成--分治法

此处提供一种生成格雷码的方式,输入一个整数nnn,表示格雷码的位数,然后打印出格雷码,所谓格雷码,简单地说,就是是每相邻两个数的二进制位都只有1位不同,是一种二进制码,例如: 要实现格雷码的输出,首先得找到格雷码的规律,基本思想是将问题分成两个子问题,分别递归求解。具体来说,从横向看,可将格雷码看做二叉树,每一个结点的值为0或1,每一节点值取决于其前2结点的值。 (1).若前2结点值为0,则当前...

qq_42712351的博客 3434

智驾系统分层架构:从传感器到执行器的全链路解析

本文深入解析了智能驾驶系统的分层架构,从传感器数据采集融合、应用层决策到车辆管理层执行,完整呈现了从感知到控制的全链路工作流程。文章重点阐述了架构设计的核心优势在于接口标准化与模块解耦,以ACC和LKA协同场景为例,说明了各层级如何通过清晰分工与高效协作,实现复杂系统的可靠、灵活与易于升级。

weixin_29219189的博客 399

windows中搭建sonic云真机环境/云真机环境搭建-基于docker容器部署

基于Windows系统搭建Sonic远程云真机环境实现通过浏览器操作手机端系统

雾林小妖的博客 1015

【Leetcode】89. 格雷编码(Gray Code)

No89. 格雷编码 题目 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。即使有多个不同答案,你也只需要返回其中一种。 格雷编码序列必须以 0 开头。 示例1 输入: 2 输出: [0,1,3,2] 解释: 00 - 0 01 - 1 11 - 3 10 - 2 对于给定的 n,其格雷编码序列并不唯一。 例如,[0,2,3,1] 也是一个有效的格雷编码序列。 00 - 0 10 - 2 11 - 3 01 - 1

Xiao_Spring的博客 1734

在 LangGraph 中集成 Skills 增强智能体能力

LangGraph 的核心是通过**状态机 + 节点(Node) + 工具(Tool)**来编排智能体流程,你可以把 Skills 理解为“封装好的工具或可复用的任务流”,下面是一套可落地的集成方案。

lpfasd123的博客 1179

【LeetCode】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 gr...

天行健,君子以自强不息 230

PyQt 随笔:信号与槽的两种使用方法:@pyqtSlot 和 connect

在 PyQt 中,信号与槽是实现事件驱动的一种重要机制。通过信号与槽的连接,可以实现对象之间的通信,例如在用户界面中响应按钮点击事件或者数据的变化等。PyQt 提供了两种主要的方法来创建信号与槽的连接:@pyqtSlot 装饰器和 connect 方法。本文将详细介绍这两种方法,并提供相应的源代码示例。在上面的示例中,我们定义了一个名为。

QasdCpp的博客 763

运行codex时出现登录失败:failed to start login server: 以一种访问权限不允许的方式做了一个访问套接字的尝试。 (os error 10013) 解决方案

的本质是Windows 系统端口保留策略而非代码 bug。推荐使用方案一(调整动态端口范围),一劳永逸解决。如果你安装了 Docker Desktop 或启用了 WSL2,调整端口范围后记得检查相关服务是否正常运行。

一键难忘的博客 4154

leetcode GrayCode 递归

Binary Code 转换为Gray Code。 如:   Binary Code :1011 要转换成Gray Code   1011 = 1(照写第一位), 1(第一位与第二位异或 1^0 = 1), 1(第二位异或第三位, 0^1=1), 0 (1^1 =0) = 1110   其实就等于 (1011 >> 1) ^ 1011 = 1110 void gr

ivebeenready的专栏 454

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

leetcode—python 50天刷题 第26题 graycode

题目描述 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。 示例 1: 输入: 2 输出: [0,1,3,2] 解释: 00 - 0 01 - 1 11 - 3 10 - 2 对于给定的 n,其格雷编码序列并不唯一。 例如,[0,2,3,1] 也是一个有效的格雷编码序列。 00 -...

weixin_45556991的博客 225

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

leetcode GrayCode C++

格雷码

随便记点东西 1007

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

leetcode GrayCode

leetcode GrayCode 格雷编码 这题一开始想了好多错误的模拟,差点没用上了搜索来做了+_+ 后来一查发现有几种方法,顺带给自己也总结一下 1 直接排列法 思路:首先0先进列表, 然后i 从1 - 2^n-1,如果为奇数,就取前一个数的 并且异或1就行了,如果为偶数 取前一个数的右边出现第一个1的位置左移一位(设这个位置为 j ) 并与前一个数异或(1&lt;&lt;j),具体问题像模...

Charles_zzz的博客 425

LeetCode(89)GrayCode

题目如下: 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 sequenc

BUILD 2721

LeetCode | GrayCode

Leetcode | GrayCode

Ajian_Dianye的博客 337

leetcode graycode

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 o...

weixin_30247159的博客 73

[LeetCode]GrayCode

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

242

LeetCode:GrayCode

题目描述: 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 s

yao_hust_iAC的专栏 695

LeetCode GrayCode

class Solution { public: vector<int> grayCode(int n) { vector<int> res; res.push_back(0); long pow2 = 1; for (int i=1; i <= n; i++) { ...

weixin_30909575的博客 71

LeetCode //C - 89. Gray Code

【代码】LeetCode //C - 89. Gray Code。

Made in Code 810

LeetCode中应用异或操作的几个题目

1.LeetCode 89题 Gray Code public List grayCode2(int n) { List result = new LinkedList<>(); for (int i = 0; i < 1 << n; i++){ result.add(i ^ i >> 1); } return result; } 2.LeetCode 136题 Single Nu

lands92的专栏 1031

LeetCode 89: GrayCode (Java)

google电面第一轮碰到的题. GrayCode:给定位数n,按规律生成一组二进制代码,直接上例子。 1位的格雷码就是0,1。2位的格雷码是在1位的格雷码前面加0或1。由上图可以发现,2位的格雷码后一位是镜像对称;3位的格雷码后2位是镜像对称;4位的格雷码后3位是镜像对称。规律就是n为格雷码是在n-1位格雷码的基础上,先将n-1位镜像...

weixin_34205826的博客 172

java gray code_LeetCode 89: GrayCode (Java)

google电面第一轮碰到的题.GrayCode:给定位数n,按规律生成一组二进制代码,直接上例子。1位的格雷码就是0,1。2位的格雷码是在1位的格雷码前面加0或1。由上图可以发现,2位的格雷码后一位是镜像对称;3位的格雷码后2位是镜像对称;4位的格雷码后3位是镜像对称。规律就是n为格雷码是在n-1位格雷码的基础上,先将n-1位镜像对称然后前一半首位添0,后一般首位添1而得到。如果要输出n位的格雷...

weixin_34439035的博客 213
上一篇: Android中关于Volley的使用(五)从RequestQueue开始来深入认识Volley
下一篇: Android中关于Volley的使用(六)认识 CacheDispatcher
linmiansheng
博客等级 码龄20年 507粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值