LeetCode(一)關於GrayCode的實現

2021-08-27 17:02:08 字數 1998 閱讀 6811

在leetcode上面有一道題,是關於gray code的實現的。

graycode是這樣一種編碼:

1 位gray code :

0

1

2 位gray code:

先新增乙個映象,如下:

011

0

然後,在原來的編碼前面新增「0」,在映象碼前面新增「1」,如下:

00

0111

10

而從2位變化到3位的gray code的實現方式跟從1位變化到2位的過程是一樣的, 都是先新增映象碼,再分別新增 「0」 和 「1」,然後,。。。

題目的要求是:

q:給出乙個n

a:輸出格雷碼序列的十進位制,上面2位的格雷碼,有00,01,11,10,那麼就要輸出0,1,3,2。

第一想法就是,先照著gray code的定義寫出來,再將其變成十進位制不就好了嗎,於是寫吧。

private arraylistgraycode(int n) 

int length = 1 << n;

arraylistlist = new arraylist<>(length);

string numbers = new string[length];

int k = 2;

numbers[0] = "0";

numbers[1] = "1";

while (k <= n)

k++;

} for (charsequence number : numbers)

list.add(value);

} return list;

}

簡單說一下思路:

1)如果是0,那麼就直接返回乙個包含「0」的list。

2)如果大於0,那麼先將陣列的前兩個元素先置成0,1,這是最基本的兩個元素。

3)接下來,按照graycode的定義,為這兩個元素新增映象碼,本來應該是下面這樣的變成映象碼:

numbers[mid + i] = numbers[mid - i - 1];
不過考慮到映象碼前面會新增「1」,那麼就直接在這一步實現就好了,所以就是上面的**了。

4)格雷碼實現好了,將它變成十進位制的數值,然後放到list,返回。

提交,是可以通過的。不過接著仔細一想,自己果然是傻的呀,題目的要求只是要輸出十進位制的數值,幹嘛要用字串呢,於是琢磨著琢磨著,就想出了下面的方法:

private arraylistgraycode2(int n) 

k++;

}} return list;

}

在這個方法中,不用字串,直接用整數來處理。

1)第一步,先新增乙個0,然後判斷n的值,如果n > 0,則繼續下去算。

2)如果n > 1,那麼第二個gray code的值一定是1,所以就直接新增1。

3)對於n >=2 的情況,則可以分成兩種情況,每次新增映象碼的時候,在映象碼前面新增「1」,而在原來的gray code前面新增"0",那麼可以發現,前半部分的格雷碼,它們的值其實是不變的!其實根本沒有必要處理它!我這是多麼笨才想到這的啊!

而對於後半部分,前面新增1,其實就是加上乙個相對應位數的值,比如3(n)位gray code的第 2(k)位(從低往高數),就是新增2 ^ (k-1) = 2,它的另外的實現方式則是

1 <<(k - 1),而這個值,剛好在上面其實就算出來了,所以就直接用就好了,這樣一來,就直接將graycode的十進位制數值給求出來了。

一測試,通過!

但是,後來在網上看到別人的實現,如下:

private arraylistgraycode3(int n) 

return list;

}

突然發現,自己真的是不適合幹這行,太笨了!

Linux基礎一 關於bash命令

1 支援命令歷史 命令補全 路徑補全 2 支援管道 重定向 3 支援命令別名 4 支援命令列編輯 5 支援命令列展開 6 支援檔名通配 7 支援變數 8 支援程式設計 1 反引號,鍵盤左上角esc下面的鍵,用於命令替換 root ymm xiaokeai echo pwd root2 雙引號,弱引用...

OpenCV筆記之一 關於Miniconda

2 配置miniconda conda update all3 建立conda虛擬環境 a.建立環境並自行命名環境名 conda create n venv or your envname python 3.8 or other edition you want b.啟用 進入虛擬環境 conda ...

學習LINUX 之一 關於磁碟配額

學習linux有一段時間了,很想自己寫一點關於學習的心得,與朋友們一起進步,可能對於linux老鳥來說有些簡單了,呵呵,衷心的希望在學習linux的道路上朋友們能夠走的更好 這篇文章寫的是關於設定使用者的配額檔案 如果配置有什麼問題希望大家和我聯絡哈 首先,我們需要在我們的linux上新建乙個使用者...