目录标题

  • 题目描述
  • 解题思路
  • 代码

题目描述

格雷码是以n位的二进制来表示数。

与普通的二进制表示不同的是,它要求相邻两个数字只能有1个数位不同。

首尾两个数字也要求只有1位之差。

有很多算法来生成格雷码。以下是较常见的一种:

从编码全0开始生成。

当产生第奇数个数时,只把当前数字最末位改变(0变1,1变0)

当产生第偶数个数时,先找到最右边的一个1,把它左边的数字改变。

用这个规则产生的4位格雷码序列如下:

0000

0001

0011

0010

0110

0111

0101

0100

1100

1101

1111

1110

1010

1011

1001

1000

解题思路

由4阶的格雷码 可以看出,格雷码的个数是2n个,且前1\2的第一位为0,后1\2的第一位为1,除了第一位之后其余的几位都是关于1\2处对称的,最后n阶的格雷码也是由n-1阶的格雷码演变而来的,n阶的格雷码就是在n-1阶格雷码的基础上在前半段的首位加上0,后半段的首位加上1,这样最好是用递归来解决。

代码

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String s = scanner.nextLine();              //输出几阶的格雷码int i = Integer.parseInt(s);StringBuffer[] sb = n(i);for(int j=0;j<sb.length;j++){if(j>0){System.out.println();}System.out.print(sb[j]);}}public static StringBuffer[] n(int n){int length = (int)Math.pow(2, n);   //根据n的值计算格雷码的个数StringBuffer[] sbArray = new StringBuffer[length];if(n==1){sbArray[0] = new StringBuffer("0");         //1阶就只有 0 1sbArray[1] = new StringBuffer("1");}else{StringBuffer[] temp = n(n-1); //递归调用n-1时的格雷码for(int i=0;i<length;i++){if(i<length/2){sbArray[i] = new StringBuffer(temp[i]);sbArray[i].insert(0, "0");//格雷码中前半部分最高位插入0}else{sbArray[i] = new StringBuffer(temp[length-i-1]);sbArray[i].insert(0, "1");//格雷码中后半部分最高位插入1}}}return sbArray;}
}

Java 算法 格雷码相关推荐

  1. 减治法在生成子集问题中的应用(JAVA)--递归、二进制反射格雷码

    减治法在生成组合对象问题中的应用 生成子集问题:经典的背包问题就是求解一个最优子集的问题,这里我们来讨论一个更简单的问题.对于任意一个集合来说,它都存在2^n个子集(一个集合所有的子集集合称为幂集). ...

  2. java 递归生成格雷码_格雷码的递归生成

    问题:产生n位元的全部格雷码.html 格雷码(Gray Code)是一个数列集合,每一个数使用二进位来表示,假设使用n位元来表示每一个数字,任两个数之间只有一个位元值不一样. 例如如下为3位元的格雷 ...

  3. 程序兵法:Java String 源码的排序算法(一)

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 这是泥瓦匠的第103篇原创 <程序兵法:Java Str ...

  4. Java自动计算迷宫正确路线算法源码

    简介: Java自动计算迷宫正确路线算法源码,首先迷宫需要满足存在开始标识和结束标识与墙标识,然后设置好行数与列数就可以开始计算正确路线了,采用的是为二维数组然后走遍所有路线的方式. 网盘下载地址: ...

  5. 算法学习(6)----整数转换为格雷码

    在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即"首尾相连",因此又称循环码或反 ...

  6. 格雷码算法c语言实验报告,算法设计与分析实验报告

    本科生实验报告 课程名称:算法设计与分析 实验项目:递归和分治算法 实验地点:计算机系实验楼110 专业课:物联网1601学生.2016002105 学生姓名:于 指导员:郝晓丽 2018年5月4日 ...

  7. 结构光之格雷码编码加相移算法详解与实现(多种编码程序)

    格雷码+相移法既可以减少格雷码的编码位数,加快解码速度,也可以弥补单纯的相移法和格雷码法的对不连续位置难以重建的缺点. 操作过程如下: 采用格雷码与相移结合的时间编码方法,具体的编码方法为:首先向被测 ...

  8. C++ 数学与算法系列之认识格雷码

    1. 前言 程序中所涉及到的任何数据,计算机底层均需转换成二进制数值后方可存储,这个过程也称为编码.反之,把底层二进制数据转换成应用数据称为解码, 不同的数据类型需要不同的编(解)码方案,如音频数据编 ...

  9. 格雷码问题:输出当输入为n时的格雷码

    1.写出n=5时的格雷码,要求写出求解过程中变量的变化过程以及求解结果 当n=5时,格雷码为: 00000 00001 00011 00010 00110 00111 00101 00100 0110 ...

最新文章

  1. 栈和堆的区别(转 知乎)
  2. html属性选择器怎么写,html – 具有“type”属性与make-up属性的CSS属性选择器和区分大小写...
  3. 线程池Executors创建多线程案例
  4. ps怎么清屏_PS:oracle恢复删除的数据
  5. java定时任务什么时间e结束_Java定时任务
  6. TensorFlow/Python的一个范例代码及阅读说明
  7. 微型计算机的软件系统分成,会计电算化辅导:微型计算机软件系统
  8. abaqus算出来的转角单位是什么_abaqus单位等等
  9. jQuery weui 时间选择器datetimepicker只用年月日
  10. yolo算法部分简单理解
  11. 晨魅--高拍仪二次开发
  12. keystone 存储 android,KeyStone存储器架构
  13. 电脑远程桌面连接怎么操作?
  14. win10自带邮箱 无法访问此账户: xxx。可能需要更新密码或授权....
  15. 鸿蒙音频低延迟,鸿蒙OS 音频播放开发指导
  16. 微信企业号加密异常处理:InvalidKeyException
  17. matter设备调试(Device Commissioning):
  18. 牛客网——求最小公倍数
  19. 互操作性2.0:奠定公链万亿美元生态的基础设施
  20. 高德地图进阶开发实战案例(10):地图选取起终点OD位置经纬度的驾车规划路线

热门文章

  1. Intel Haswell/Broadwell架构/微架构/流水线 (5)-高速缓存存储器子系统
  2. Android中XML数据解析
  3. springboot2.x 从零到一(1、快速创建服务)
  4. Algorithms Part 1-Question 2-QuickSort-快速排序算法
  5. 2021抚顺高考成绩查询,2021年抚顺高考成绩排名及成绩公布时间什么时候出来
  6. redis 分页_Redis排行榜的设计与实现
  7. qt连接mysql创建表_用Qt访问数据库写一个 表格
  8. 对接物联网设备tcp协议_什么是物联网?常见IoT协议最全讲解
  9. 为虚幻引擎4设置Visual Studio
  10. POJ - 2069 Super Star HDU - 3007 Buried memory