405. Convert a Number to Hexadecimal

题目描述和难度

  • 题目描述:

给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。

注意:

  1. 十六进制中所有字母(a-f)都必须是小写。
  2. 十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符'0'来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。 
  3. 给定的数确保在32位有符号整数范围内。
  4. 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。

示例 1:

输入:
26

输出:
"1a"

示例 2:

输入:
-1

输出:
"ffffffff"

思路分析

求解关键:这道题的写法也比较典型,每次取出最低 4 位做一个映射。

  • 特别注意题目中要求,不能有多余的前导 “0”,因此对于二进制以后高位是 0 的情况就不必再拼接 0 了。

参考解答

参考解答1

public class Solution {

    /**
     * 索引到字符的映射表,实现了类似字典的功能
     */
    private static char[] map = {'0', '1', '2', '3', '4', '5', '6', '7',
            '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

    /**
     * 15 的二进制表示就是 1111
     */
    private static final int MASK = 15;

    public String toHex(int num) {
        // 注意点 1:对于 0 的特殊处理
        if (num == 0) {
            return "0";
        }
        StringBuilder hex = new StringBuilder();
        // 注意点 2:如果高位已经是 0 ,就不必再拼接 0 了,这是题目中的要求
        for (int i = 0; i < 8 && num != 0; i++) {
            // 取最低 4 位,进行转换
            hex.insert(0, map[num & MASK]);
            // 无符号右移 4 位
            // 10001011
            num >>>= 4;
        }
        return hex.toString();
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        int num = 16;
        String toHex = solution.toHex(num);
        System.out.println(toHex);

        System.out.println(-1);
    }
}

本篇文章的地址为 https://liweiwei1419.github.io/leetcode-solution/leetcode-0405-convert-a-number-to-hexadecimal ,如果我的题解有错误,或者您有更好的解法,欢迎您告诉我 liweiwei1419@gmail.com