LeetCode#405. 数字转换为十六进制数

193 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

一、题目描述:

405. 数字转换为十六进制数

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

注意:

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

示例 1:

输入:
26

输出:
"1a"

示例 2:

输入:
-1

输出:
"ffffffff"

二、思路分析:

当为正数时,进制的转换就和普通的进制转换没有区别,就是辗转相除法。问题在于当数为负数时。

我们一般辗转相除法是这样的

num%16
num/=16

但是,当 num 为负数时,上面的做法就行不通了,因为上面的做法都是基于十进制的,所以,为了通用,而且由于 16 是 2 的幂,所以我们都转换为二进制操作。

而 4 位二进制就转换为一个十六进制,所以我们每次取低 4 位组成一个十六进制,然后右移 4 位即可。

三、AC 代码:

class Solution {
public:
    string toHex(int num) {
        string res;        
        
        if (num==0){
            return "0";
        }                
        
        if (num>0){
            while(num!=0){
                res.insert(res.begin(),toChar(num&0xf));
                num>>=4;                            
            }
            return res;
        } 
        
        for (int i=0;i<8;i++){
            res.insert(res.begin(),toChar(num&0xf));
            num>>=4;            
        }
        
        return res;
    }
    
    char toChar(int x){
        switch(x){
            case 10:
                return 'a';
            case 11:
                return 'b';
            case 12:
                return 'c';
            case 13:
                return 'd';
            case 14:
                return 'e';
            case 15:
                return 'f';                
            default:
                return x+'0';
        }
    }
};

四、参考:

清晰易懂的哈希表解法(击败100%), C++/Python/Java/C#全部实现【大白技术控】 - 数字转换为十六进制数 - 力扣(LeetCode)