【LeetCode-面试算法经典-Java实现】【089-Gray Code(格雷码)】

【089-Gray Code(格雷码)】


【LeetCode-面试算法经典-Java实现】【所有题目目录索引】

原题

  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 gray code. A gray code sequence must begin with 0.

  For example, given n = 2, return [0,1,3,2]. Its gray code sequence is:

00 - 0
01 - 1
11 - 3
10 - 2

  Note:

  For a given n, a gray code sequence is not uniquely defined.

  For example, [0,2,3,1] is also a valid gray code sequence according to the above definition.

  For now, the judge is able to judge based on one instance of gray code sequence. Sorry about that.

题目大意

  给定n,输出长度为n的格雷码表。

解题思路

  递归生成码表

  这种方法基于格雷码是反射码的事实,利用递归的如下规则来构造:

  1位格雷码有两个码字

  (n+1)位格雷码中的前2n个码字等于n位格雷码的码字,按顺序书写,加前缀0

  (n+1)位格雷码中的后2n个码字等于n位格雷码的码字,按逆序书写,加前缀1

代码实现

算法实现类

import java.util.LinkedList;
import java.util.List;

public class Solution {

    public List<Integer> grayCode(int n) {
        List<Integer> result = new LinkedList<>();
        if (n >= 0) {
            // 格雷码的前半部分
            result.add(0);
            // 格雷码最高位的值(非0时)
            int t = 1;
            // 每一次外循环求出的是位数i+1位的格雷码表,其相当于长度为i+1位的格雷码表的前半部分
            for (int i = 0; i < n; i++) {
                // 求出的长度为i+1位格雷码表的后半部分,前半部分由长度为i位的格雷码表给出
                for (int j = result.size() - 1; j >= 0; j--) {
                    result.add(result.get(j) ^ t);
                }
                // 最高位右移
                t <<= 1;
            }
        }
        return result;
    }
}

评测结果

  点击图片,鼠标不释放,拖动一段位置,释放后在新的窗口中查看完整图片。

特别说明

欢迎转载,转载请注明出处【http://blog.csdn.net/derrantcm/article/details/47290709

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 04:58:23

【LeetCode-面试算法经典-Java实现】【089-Gray Code(格雷码)】的相关文章

算法学习 - Gray Code(格雷码)的解释和c++实现

Gray Code(格雷码) 典型的二进制格雷码(Binary Gray Code)简称格雷码.当初是为了通信,现在则常用于模拟-数字转换和位置-数字转换中. 特点是:一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码. 格雷码属于可靠性编码,是一种错误最小化的编码方式. 格雷码是一种绝对编码方式. 由于格雷码是一种变权码. 格雷码的十进制数奇偶性与其码字中1的个数的奇偶性相同. 十进制转换为格雷码 好的上面我们已经介绍那么多了,那么我来说下如何把一个十进制的数字转换

[LeetCode] 89. 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 gray code. A gray code sequence must begin with 0. Ex

089 Gray Code 格雷编码

格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异.给定一个代表编码总位数的非负整数 n,打印格雷码序列.格雷码序列必须以0开头.例如, 给定 n = 2, 返回 [0,1,3,2].其格雷编码是:00 - 001 - 111 - 310 - 2注意:对于给定的 n,其格雷编码的顺序并不唯一.例如 [0,2,3,1] 也是一个有效的格雷编码顺序.目前,系统只可以根据一个格雷编码序列实例进行判断.请您谅解.详见:https://leetcode.com/problems/g

gray code 格雷码 递归

格雷码 the n-1 bit code, with 0 prepended to each word, followd by the n-1 bit code in reverse order, with 1 prepended to each word. public class GrayCode{ public static void gray(int n, String prefix) { if(n == 0) System.out.println(prefix); else { gra

LeetCode Gray Code 格雷码

题意:提供一个数字n,代表二进制的个数,那么就有2的n次方个可能性了,从0到2^n-1.将其转成格雷码,再直接将二进制的格雷码按二进制的读法变成整数,装在vector容器中返回,要有序(否则你直接将0-2^n-1返回算了). 思路:咋一看!什么是格雷码?假设有1个整数,是二进制形式的,将其最高位的1提出来,其他的每一位等于该位上的数字与该数字的前一位之异或. 好像很复杂的样子?举例: 整数 21 = 0001 0101 二进制 ,格雷码前4位是这样的0001,这就是将二进制的最高位的1提出来啦,

【LeetCode-面试算法经典-Java实现】【139-Word Break(单词拆分)】

[139-Word Break(单词拆分)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words. For example, given s = "leetcode", di

【LeetCode-面试算法经典-Java实现】【107-Binary Tree Level Order Traversal II(二叉树层序遍历II)】

[107-Binary Tree Level Order Traversal II(二叉树层序遍历II)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root). For example

【LeetCode-面试算法经典-Java实现】【064-Minimum Path Sum(最小路径和)】

[064-Minimum Path Sum(最小路径和)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path. Note: You can only move either

【LeetCode-面试算法经典-Java实现】【056-Merge Intervals(区间合并)】

[056-Merge Intervals(区间合并)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6],[8,10],[15,18], return [1,6],[8,10],[15,18]. 题目大意 给定一个区间集合,合并有重叠的区间. 解题思路 先对区间进行排序.按開始