切換
舊版
前往
大廳
主題

LeetCode - 405. Convert a Number to Hexadecimal 解題心得

Not In My Back Yard | 2020-10-16 00:30:42 | 巴幣 0 | 人氣 320

題目連結:


題目意譯:
給定一整數,撰寫一個演算法將該數轉為十六進位制。對於負整數,使用二補數(Two's Complement)的方式。

注:
所有十六進位中的字母(a ~ f)必須為小寫。
十六進位字串不能包含任何前導 0。如果該數為 0,則應表為單一一個字元「0」;非 0 者,其轉成十六進位制之字串不會以 0 作為開頭。
給定的數字保證可以存進 32 位元有號整數之儲存範圍。
你不能使用任何函式庫內建的方法、函式去將數字直接轉為十六進位。



範例測資:
範例 1:
輸入: 26
輸出: "1a"

範例 2:
輸入: -1
輸出: "ffffffff"


解題思維:
正如同十進位制轉成其他進位制的方式一樣。假設一數 N = 48763,將 N 一直除以 16 求出商數以及餘數(以下過程中的數字皆是十進位制的):
48763 ÷ 16 = 3047 餘 11;
3047 ÷ 16 = 190 餘 7;
190 ÷ 16 = 11 餘 14;
11 ÷ 16 = 0 餘 11;
當除到得出商數 = 0 時,即可停止。而上面得到的從下往上列出的話為 11 、 14 、 7 、 11 ,轉成十六進位的「符號」為 B 、 E 、 7 、 B。而 N 的十六進位制表示法正好就是 BE7B。



而為何可以一直除以 16 取餘數便可以得出該數的十六進位制?

將十六進位制一個數字 DnDn-1……D2D1 (每個 Di 代表一位數,且 n 為一個十進位數字)寫為
Dn × 16 ^ (n - 1) + Dn-1 × 16 ^ (n - 2) + …… + D2 × 16 + D1
這樣子的次方表示法(上式除了 Dn 、 Dn-1 、…… 以外的數字為十進位制),並令上式的十進位值為 S 。

當我們將 S 除以 16 時,上面的式子的 Dn ~ D2 之項皆可被 16 整除,唯獨剩下 D1

D1 恰好是 S ÷ 16 的餘數,此時令商數為 S',可得出 S = S' × 16 + D1

再迭代一次,商數為 S''、餘數恰好為 D2 ,得出 S = S' × 16 + D1 = S'' × 16 ^ 2 + D2 × 16 + D1

繼續下去我們就可以得到 D3 、 D4 、 …… 最後得到 Dn

因此可以看出這個演算法可以將一數 S 轉為十六進位制。而不僅限於十六進位,任意進位制都可以參照上面的作法。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作