在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上新建乙個使用者...