题目描述

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(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 -生成格雷码)的更多相关文章

  1. 产生n位元的所有格雷码

    原文链接:http://blog.csdn.net/beiyeqingteng/article/details/7044471 问题:产生n位元的所有格雷码. 格雷码(Gray Code)是一个数列集 ...

  2. 1081: [SCOI2005]超级格雷码

    1081: [SCOI2005]超级格雷码 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 301  Solved: 159[Submit][Statu ...

  3. C语言输出格雷码

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

  4. 格雷码Gray Code详解

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

  5. 构建n位元的格雷码

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

  6. LeetCode 格雷码序列的生成

    问题概述:在一组数的编码中,若随意两个相邻的代码仅仅有一位二进制数不同.则称这样的编码为格雷码. 2位数的格雷码序列:00 : 001 : 111 : 310 : 2找规律:假设要求n位的格雷码,先要 ...

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

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

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

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

  9. 【解题报告】CSP2019-S D1T1 格雷码

    题目链接:https://www.luogu.org/problem/P5657 话说这道题怎么是道橙题啊. 基本思路 因为n位格雷码的前2n-1位就是n-1位格雷码前面加了一位‘0’,所以可以把它们 ...

随机推荐

  1. 二维数组的查找(JAVA)

    二维数组查找 解题思路:找到该二维数组的特殊点,易知该二维数组左下角的那个点很特殊.从这个点往右看,数值都在变大:而往上看,数值都在变小.所以 我们可以将这个点的索引设为起点(i,j),当比目标数大时 ...

  2. UEFI+GPT双硬盘安装Win10+Ubuntu16.04双系统

    转载请注明出处:http://www.cnblogs.com/willnote/p/6725594.html 安装环境 SSD+HDD双盘,Win10安装在SSD里,HDD分出来60G安装Ubuntu ...

  3. PythonStudy——集合 Set

    # 空集合:不能用{},因为用来标示空字典 s = set() print(s, type(s)) # 概念:# 1.set为可变类型 - 可增可删# 2.set为去重存储 - set中不能存放重复数 ...

  4. 1.3 Linux分区类型

    1.主分区最多只能有4个. 2.扩展分区: 最多只能有一个: 主分区加扩展分区最多只能有4个: 扩展分区只能包含逻辑分区,不能写数据. 3.格式化目的: 写入文件系统:清除数据:划出文件分配表(i n ...

  5. AR外包,就找北京动点软件,长年承接AR外包(案例丰富可签合同,内附案例演示)

    北京团队长年承接AR项目外包 咨询QQ:372900288  微信:liuxiang0884 以下是AR项目案例演示,索取更多案例请通过以上方式在线联系我们

  6. 这台计算机上缺少此项目引用的 NuGet 程序包,DotNetCompilerPlatform

    严重性 代码 说明 项目 文件 行 禁止显示状态错误 这台计算机上缺少此项目引用的 NuGet 程序包.使用“NuGet 程序包还原”可下载这些程序包.有关更多信息,请参见 http://go.mic ...

  7. 不常用的vi命令

    vi u 撤回ctrl+r 撤回的撤回 全文替换%s/old/new/g 指定行区间替换12,15s/old/new/g c替换前确认12,15s/old/new/gc 用#代替分隔符,用户关键字有/ ...

  8. linux命令行命令

    Linux命令行编辑快捷键: history 显示命令历史列表 ↑(Ctrl+p) 显示上一条命令 ↓(Ctrl+n) 显示下一条命令 !num 执行命令历史列表的第num条命令 !! 执行上一条命令 ...

  9. Windows10右键添加"在此处打开命令窗口"

    添加注册表: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\shell\OpenCmdHere] @=" ...

  10. Schtasks命令详解(计划任务DOS批处理)

    Schtasks 安排命令和程序定期运行或在指定时间内运行.从计划表中添加和删除任务,按需要启动和停止任务,显示和更改计划任务. 创建新的计划任务. 语法 schtasks/create/tnTask ...