1. 程式人生 > >領釦(LeetCode)數字轉換為十六進位制數 個人題解

領釦(LeetCode)數字轉換為十六進位制數 個人題解

給定一個整數,編寫一個演算法將這個數轉換為十六進位制數。對於負整數,我們通常使用 補碼運算 方法。

注意:

  1. 十六進位制中所有字母(a-f)都必須是小寫。
  2. 十六進位制字串中不能包含多餘的前導零。如果要轉化的數為0,那麼以單個字元'0'來表示;對於其他情況,十六進位制字串中的第一個字元將不會是0字元。 
  3. 給定的數確保在32位有符號整數範圍內。
  4. 不能使用任何由庫提供的將數字直接轉換或格式化為十六進位制的方法。

示例 1:

輸入:
26

輸出:
"1a"

示例 2:

輸入:
-1

輸出:
"ffffffff"


首先拿到這題,比較簡單的一個思路是把負數轉換為正數的形式(因為我們知道,負數在計算機中的存放值=2^N+該負數,N為儲存的位數)。但是在JAVA中,這個思路會在num值為-1的情況下出現下標溢位的情況。這個問題還不知道原因。

於是我百度了一下,發現了一個更優秀的做法。也就是類比電路加減的做法,把數字拿去和0xf相與,得到的結果就是數字的最後四位二進位制代表的十進位制數值。然後繼續把該數字算術右移四位,也就是相當於得到下一個四位二進位制的值,以此類推。通過二進位制的做法,規避了操作十進位制數時負數的問題。

在這題裡使用位運算需要注意不要超出八位數,因為負數的算術右移可以在正常右移結束後得到非零值,迴圈不會正確退出。

程式碼如下:

 1 class Solution {
 2     public String toHex(int num) {
 3         if (num == 0)
 4             return
"0"; 5 char[] pat = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; 6 String ans = ""; 7 while (num != 0 && ans.length() <= 8) 8 { 9 ans = pat[num & 0xf] + ans; 10 num >>= 4; 11 }
12 return ans; 13 14 } 15 }