解题(GeLeiMa -生成格雷码)
题目描述
在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码。
给定一个整数n,请返回n位的格雷码,顺序为从0开始。
1
返回:["0","1"]
代码如下:
package com.yzh.xuexi;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class GeLeiMa {
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
while (scanner.hasNext()) {
int n=Integer.valueOf(scanner.nextLine());
List<String>list1=new ArrayList<>((int)Math.pow(2, n));
List<String>list2=new ArrayList<>((int)Math.pow(2, n));
List<String>result=geLeiMa(n, list1, list2);
StringBuilder stringBuilder=new StringBuilder((int)(Math.pow(2, n)*(n+3)+2));
stringBuilder.append("[");
for(String temp:result){
stringBuilder.append("\"");
stringBuilder.append(temp);
stringBuilder.append("\",");
}
stringBuilder.delete(stringBuilder.length()-1, stringBuilder.length());
stringBuilder.append("]");
System.out.println(stringBuilder.toString());
}
scanner.close();
}
private static List<String> geLeiMa(int n,List<String> list1,List<String> list2){
//递归出口
if (n==1) {
list1.add("0");
list1.add("1");
return list1;
}
//递归求n-1位的格雷码
list1=geLeiMa(n-1,list1,list2);
//根据n-1位的格雷码求n位的格雷码
//比如求n=3的gray码,首先知道n=2的gray码是(00,01,11,10)
//那么n=3的gray码其实就是对n=2的gray码首位添加0或1生成的,添加0后变成(000,001,011,010)
//添加1后需要顺序反向就变成(110,111,101,100)
//组合在一起就是(000,001,011,010,110,111,101,100)
for(String temp:list1){
list2.add("0"+temp);
}
for(int i=list1.size()-1;i>=0;i--){
list2.add("1"+list1.get(i));
}
list1.clear();
list1.addAll(list2);
list2.clear();
return list1;
}
}
解题(GeLeiMa -生成格雷码)的更多相关文章
- 产生n位元的所有格雷码
原文链接:http://blog.csdn.net/beiyeqingteng/article/details/7044471 问题:产生n位元的所有格雷码. 格雷码(Gray Code)是一个数列集 ...
- 1081: [SCOI2005]超级格雷码
1081: [SCOI2005]超级格雷码 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 301 Solved: 159[Submit][Statu ...
- C语言输出格雷码
格雷码是以n位的二进制来表示数. 与普通的二进制表示不同的是,它要求相邻两个数字只能有1个数位不同. 首尾两个数字也要求只有1位之差. 有很多算法来生成格雷码.以下是较常见的一种: 从编码全0开始生成 ...
- 格雷码Gray Code详解
格雷码简介 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码.格 ...
- 构建n位元的格雷码
二进制格雷码的生成 1.什么是格雷码 Gray Code是一个数列集合,每个数使用二进制来表示,假设使用n位元来表示每个数字,那么任两个数之间只有一个位元值不同.log2(16)=4 例如: 生成4位 ...
- LeetCode 格雷码序列的生成
问题概述:在一组数的编码中,若随意两个相邻的代码仅仅有一位二进制数不同.则称这样的编码为格雷码. 2位数的格雷码序列:00 : 001 : 111 : 310 : 2找规律:假设要求n位的格雷码,先要 ...
- 格雷码(Grey Code)生成规则
(1) Grey码在FPGA实际应用中是实用的码,在8421BCD码累加计数器中,如果寄存器需要发生多位(两位或者以上)的跳变,会出现中间态,这样作为组合逻辑的输入是不稳妥的. 下面看两个中间态的例子 ...
- leetCode 89.Gray Code (格雷码) 解题思路和方法
The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...
- 【解题报告】CSP2019-S D1T1 格雷码
题目链接:https://www.luogu.org/problem/P5657 话说这道题怎么是道橙题啊. 基本思路 因为n位格雷码的前2n-1位就是n-1位格雷码前面加了一位‘0’,所以可以把它们 ...
随机推荐
- 二维数组的查找(JAVA)
二维数组查找 解题思路:找到该二维数组的特殊点,易知该二维数组左下角的那个点很特殊.从这个点往右看,数值都在变大:而往上看,数值都在变小.所以 我们可以将这个点的索引设为起点(i,j),当比目标数大时 ...
- UEFI+GPT双硬盘安装Win10+Ubuntu16.04双系统
转载请注明出处:http://www.cnblogs.com/willnote/p/6725594.html 安装环境 SSD+HDD双盘,Win10安装在SSD里,HDD分出来60G安装Ubuntu ...
- PythonStudy——集合 Set
# 空集合:不能用{},因为用来标示空字典 s = set() print(s, type(s)) # 概念:# 1.set为可变类型 - 可增可删# 2.set为去重存储 - set中不能存放重复数 ...
- 1.3 Linux分区类型
1.主分区最多只能有4个. 2.扩展分区: 最多只能有一个: 主分区加扩展分区最多只能有4个: 扩展分区只能包含逻辑分区,不能写数据. 3.格式化目的: 写入文件系统:清除数据:划出文件分配表(i n ...
- AR外包,就找北京动点软件,长年承接AR外包(案例丰富可签合同,内附案例演示)
北京团队长年承接AR项目外包 咨询QQ:372900288 微信:liuxiang0884 以下是AR项目案例演示,索取更多案例请通过以上方式在线联系我们
- 这台计算机上缺少此项目引用的 NuGet 程序包,DotNetCompilerPlatform
严重性 代码 说明 项目 文件 行 禁止显示状态错误 这台计算机上缺少此项目引用的 NuGet 程序包.使用“NuGet 程序包还原”可下载这些程序包.有关更多信息,请参见 http://go.mic ...
- 不常用的vi命令
vi u 撤回ctrl+r 撤回的撤回 全文替换%s/old/new/g 指定行区间替换12,15s/old/new/g c替换前确认12,15s/old/new/gc 用#代替分隔符,用户关键字有/ ...
- linux命令行命令
Linux命令行编辑快捷键: history 显示命令历史列表 ↑(Ctrl+p) 显示上一条命令 ↓(Ctrl+n) 显示下一条命令 !num 执行命令历史列表的第num条命令 !! 执行上一条命令 ...
- Windows10右键添加"在此处打开命令窗口"
添加注册表: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\shell\OpenCmdHere] @=" ...
- Schtasks命令详解(计划任务DOS批处理)
Schtasks 安排命令和程序定期运行或在指定时间内运行.从计划表中添加和删除任务,按需要启动和停止任务,显示和更改计划任务. 创建新的计划任务. 语法 schtasks/create/tnTask ...