1. 程式人生 > >LeetCode 第八十九題 格雷編碼(Gray Code)

LeetCode 第八十九題 格雷編碼(Gray Code)

題目:
格雷編碼是一個二進位制數字系統,在該系統中,兩個連續的數值僅有一個位數的差異。
給定一個代表編碼總位數的非負整數 n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。

解題:

  • 首先,補充一下格雷碼的含義:在一組數的編碼中,若任意兩個相鄰的程式碼只有一位二進位制數不同,則稱這種編碼為格雷碼。例如,位數為2格雷碼的其中一個序列:00,01,11,10,它們任意兩個相鄰的數值,只有一個位數不同。
  • 解題思路:如果我們書寫三位的格雷碼的一個序列:000,001,011,010,110,111,101,100。我們會發現一個奇怪的現象,前面四個數,跟後面四個數,第一位不同,後面剛好後四個數的順序是前四個數的逆序。通過查閱資料,可知,這是由於格雷碼是反射二進位制碼(
    http://www.baike.com/wiki/反射二進位制碼
    )我們根據這一特點,利用遞迴的如下規則來構造:
    • 1位格雷碼有兩個碼字
    • (n+1)位格雷碼中的前2n個碼字等於n位格雷碼的碼字,按順序書寫,加字首0
    • (n+1)位格雷碼中的後2n個碼字等於n位格雷碼的碼字,按逆序書寫,加字首1
    • n+1位格雷碼的集合 = n位格雷碼集合(順序)加字首0 + n位格雷碼集合(逆序)加字首1
import java.util.ArrayList;
import java.util.List;

public class N89_GrayCode {
    private static List<Integer>
grayCode(int n) { List<Integer> list = new ArrayList<>(); // 給定編碼總位數為 n 的格雷編碼序列,其長度為 2n。 // 當 n = 0 時,長度為 2^0 = 1。 // 因此,當 n = 0 時,其格雷編碼序列為 [0]。 if (n == 0) { list.add(0); return list; } // 這裡獲得格雷碼的二進位制碼的形式,再將二進位制碼轉為數字 String[
] temp = getGrayCode(n); for (String a : temp ) { list.add(Integer.parseInt(a, 2)); } return list; } private static String[] getGrayCode(int n) { String[] output = null; // 一位的格雷碼有兩個 if (n == 1) { output = new String[]{"0", "1"}; } else { // 獲取(n - 1)位格雷碼 String[] temp = getGrayCode(n - 1); output = new String[temp.length * 2]; for (int i = 0; i < temp.length; i++) { // n位格雷碼集合(順序)加字首0 output[i] = "0" + temp[i]; // n位格雷碼集合(逆序)加字首1 output[temp.length * 2 - i - 1] = "1" + temp[i]; } } return output; } }

相關推薦

LeetCode 編碼Gray Code

題目: 格雷編碼是一個二進位制數字系統,在該系統中,兩個連續的數值僅有一個位數的差異。 給定一個代表編碼總位數的非負整數 n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。 解題: 首先,補充一下格雷碼的含義:在一組數的編碼中,若任意兩個相鄰的程式碼只有一

leetcode 簡單】 贖金信

第一個 div nbsp for 第一個字符 span counter map 註意 給定一個贖金信 (ransom) 字符串和一個雜誌(magazine)字符串,判斷第一個字符串ransom能不能由第二個字符串magazines裏面的字符構成。如果可以構成,返回 tru

leetcode 簡單】 同構字符串

另一個 tco 保留 {} 簡單 urn code 映射 for 給定兩個字符串 s 和 t,判斷它們是否是同構的。 如果 s 中的字符可以被替換得到 t ,那麽這兩個字符串是同構的。 所有出現的字符都必須用另一個字符替換,同時保留字符的順序。兩個字符不能映射到同一個字符

leetcode 簡單】 兩整數之和

turn div 計算 pre lee nbsp gets tco shu 不使用運算符 + 和-,計算兩整數a 、b之和。 示例: 若 a = 1 ,b = 2,返回 3。 class Solution: def getSum(self, a, b):

x的平方根leetcode簡單篇

實現 int sqrt(int x) 函式。 計算並返回 x 的平方根,其中 x 是非負整數。 由於返回型別是整數,結果只保留整數的部分,小數部分將被捨去。 示例 1: 輸入: 4 輸出: 2 示例 2: 輸入: 8 輸出: 2 說明: 8

LeetCode記錄——x的平方根

題目描述 實現 int sqrt(int x) 函式。 計算並返回 x 的平方根,其中 x 是非負整數。 由於返回型別是整數,結果只保留整數的部分,小數部分將被捨去。 示例 1: 輸入: 4 輸出: 2 示例 2: 輸入: 8 輸出: 2

搜尋二叉樹建立

如何編寫一個程式,把一個有序整數陣列放到二叉樹中? 分析:為了讓搜尋二叉樹的查詢等操作接近於O(log(n))。我們以有序陣列的中間位置的數字作為搜尋二叉樹的根節點,以其左半部分資料建立搜尋二叉樹作為根節點的左子樹。以其有半部分資料建立搜尋二叉樹作為根節點的右子樹。這是一個遞

“全棧2019”Java章:介面中能定義內部類嗎?

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第八十九章:介面中能定義內部類嗎? 下一章 “全棧2019”Java第九十章:內部類可以向上

學習淘淘商城單點登入之通過token獲取使用者資訊

        首先還是看介面文件關於通過token獲取使用者資訊的說明,如下圖所示。             看了說明文件我們便知道該怎麼做了,在taotao-sso-interface工程的UserService介面類中新增一個介面,如下圖所示。          

《劍指offer》醜數

醜數 exp 第一個 算法 ber 大於 offer return false // 面試題49:醜數 // 題目:我們把只包含因子2、3和5的數稱作醜數(Ugly Number)。求按從小到 // 大的順序的第1500個醜數。例如6、8都是醜數,但14不是,因為它

leecode螺旋矩陣 II

code i++ 一行 emp src alt 初始化 圖片 gen class Solution { public: vector<vector<int>> generateMatrix(int n) {

LeetCode 89. 編碼C、C++、python

格雷編碼是一個二進位制數字系統,在該系統中,兩個連續的數值僅有一個位數的差異。 給定一個代表編碼總位數的非負整數 n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。 示例 1: 輸入: 2 輸出: [0,1,3,2] 解釋: 00 - 0 01 - 1

LeetCode——89. 編碼JavaScript

格雷編碼是一個二進位制數字系統,在該系統中,兩個連續的數值僅有一個位數的差異。 給定一個代表編碼總位數的非負整數 n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。 示例 1: 輸入: 2 輸出: [0,1,3,2] 解釋: 00 - 0 01 - 1 11 - 3 10 -

Leetcode 89:編碼超詳細的解法!!!

格雷編碼是一個二進位制數字系統,在該系統中,兩個連續的數值僅有一個位數的差異。 給定一個代表編碼總位數的非負整數 n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。 示例 1: 輸入: 2 輸出: [0,1,3,2] 解釋: 00 - 0 01 - 1 11 - 3 10

屆藍橋杯大賽個人賽決賽軟體類 -----Java大學C組------樹形顯示

標題:樹形顯示對於分類結構可以用樹形來形象地表示。比如:檔案系統就是典型的例子。樹中的結點具有父子關係。我們在顯示的時候,把子項向右縮排(用空格,不是tab),並新增必要的連線線,以使其層次關係更醒目。下面的程式碼就是為了這個目的的,請仔細閱讀原始碼,並填寫劃線部分缺少的程式

屆藍橋杯大賽個人賽決賽軟體類 Java大學B組 答案

標題:平方十位數由0~9這10個數字不重複、不遺漏,可以組成很多10位數字。這其中也有很多恰好是平方數(是某個數的平方)。比如:1026753849,就是其中最小的一個平方數。請你找出其中最大的一個平方數是多少?注意:你需要提交的是一個10位數字,不要填寫任何多餘內容。答案:

屆藍橋杯大賽個人賽決賽軟體類 -----Java大學C組------數位和

標題:數位和數學家高斯很小的時候就天分過人。一次老師指定的算數題目是:1+2+...+100。高斯立即做出答案:5050!這次你的任務是類似的。但並非是把一個個的數字加起來,而是對該數字的每一個數位作累加。這樣從1加到100的“和”是:901從10加到15是:21,也就是:1

軟工實踐 - 第二次作業 Beta 衝刺7/7

隊名:起床一起肝活隊 組長部落格:https://www.cnblogs.com/dawnduck/p/10159251.html 作業部落格:[班級部落格本次作業的連結] (https://edu.cnblogs.com/campus/fzu/Grade2016SE/homework/2498) 組員情

【SpringCloud Greenwich版本】章:配置中心客戶端config client

一、SpringCloud版本 本文介紹的Springboot版本為2.1.1.RELEASE,SpringCloud版本為Greenwich.RC1,JDK版本為1.8,整合環境為IntelliJ IDEA 二、config client介紹 Spring Boot應用程式可以

屆藍橋杯 k倍區間字首和

標題: k倍區間 給定一個長度為N的數列,A1, A2, ... AN,如果其中一段連續的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍數,我們就稱這個區間[i, j]是