Article / 文章

LeetCode 第405题:数字转换为十六进制数

给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用补码运算方法。 注意: 1. 十六进制中所有字母(a-f)都必须是小写。 2. 十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符'0'来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。 3. 给定的数确保在32位有符号整数范围内。 4. 不能使

📖 文章摘要

本文详细解析LeetCode第405题“数字转换为十六进制数”,这是一道关于位运算和进制转换的简单题目。文章提供了完整的解题思路,包含C#、Python、C++三种语言实现,配有详细的图解和性能分析。适合想要学习位运算和进制转换的读者。

核心知识点: 位运算、进制转换、补码表示
难度等级: 简单
推荐人群: 对位运算和进制转换感兴趣的初学者

题目描述

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

注意:

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

示例

示例 1:

输入:num = 26
输出:"1a"

示例 2:

输入:num = -1
输出:"ffffffff"

提示

  • -2^31 <= num <= 2^31 - 1

解题思路

这道题可以使用位运算来解决。核心思路是:

  1. 处理负数:

    • 对于负数,使用补码表示
    • 32位整数的补码就是其二进制表示
  2. 位运算转换:

    • 每4位二进制对应1位十六进制
    • 使用位运算每次取出4位
    • 将4位二进制转换为对应的十六进制字符
  3. 实现细节:

    • 使用位与运算取最低4位
    • 使用位移运算处理下一组4位
    • 注意前导零的处理

图解思路

十六进制转换表

十进制 二进制 十六进制 说明
0-9 0000-1001 0-9 直接使用数字
10 1010 a 使用小写字母
11 1011 b 使用小写字母
12 1100 c 使用小写字母
13 1101 d 使用小写字母
14 1110 e 使用小写字母
15 1111 f 使用小写字母

转换过程分析表

输入 二进制表示 4位分组 十六进制 说明
26 11010 0001 1010 1a 正数直接转换
-1 11111111… ffff ffff ffffffff 负数使用补码
0 0 0000 0 特殊情况处理

代码实现

C# 实现

public class Solution {
    public string ToHex(int num) {
        if (num == 0) return "0";
        
        // 十六进制字符表
        char[] hexChars = "0123456789abcdef".ToCharArray();
        string result = "";
        
        // 由于负数使用补码表示,直接按无符号数处理即可
        // 最多需要8位十六进制数(32位二进制)
        for (int i = 0; i < 8 && num != 0; i++) {
            // 取最低4位
            int digit = num & 15;
            // 添加对应的十六进制字符
            result = hexChars[digit] + result;
            // 无符号右移4位
            num >>>= 4;
        }
        
        return result;
    }
}

Python 实现

class Solution:
    def toHex(self, num: int) -> str:
        if num == 0:
            return "0"
        
        # 处理负数,转换为32位无符号整数
        if num < 0:
            num = num + 2**32
        
        # 十六进制字符表
        hex_chars = "0123456789abcdef"
        result = ""
        
        while num:
            # 取最低4位
            digit = num & 15
            # 添加对应的十六进制字符
            result = hex_chars[digit] + result
            # 右移4位
            num >>= 4
        
        return result

C++ 实现

class Solution {
public:
    string toHex(int num) {
        if (num == 0) return "0";
        
        // 十六进制字符表
        const string hex_chars = "0123456789abcdef";
        string result = "";
        
        // 使用unsigned int处理负数
        unsigned int n = num;
        
        while (n) {
            // 取最低4位
            int digit = n & 15;
            // 添加对应的十六进制字符
            result = hex_chars[digit] + result;
            // 右移4位
            n >>= 4;
        }
        
        return result;
    }
};

执行结果

C# 实现

  • 执行用时:76 ms
  • 内存消耗:36.2 MB

Python 实现

  • 执行用时:32 ms
  • 内存消耗:15.1 MB

C++ 实现

  • 执行用时:0 ms
  • 内存消耗:5.9 MB

性能对比

语言 执行用时 内存消耗 特点
C# 76 ms 36.2 MB 使用无符号右移
Python 32 ms 15.1 MB 处理负数转换简单
C++ 0 ms 5.9 MB 使用unsigned int高效

代码亮点

  1. 🎯 巧妙处理负数的补码表示
  2. 💡 使用位运算提高效率
  3. 🔍 优雅处理前导零
  4. 🎨 代码结构清晰,易于理解

常见错误分析

  1. 🚫 没有正确处理负数
  2. 🚫 输出包含前导零
  3. 🚫 使用库函数直接转换
  4. 🚫 字母大小写错误

解法对比

解法 时间复杂度 空间复杂度 优点 缺点
位运算 O(1) O(1) 高效直接 需要理解补码
除法取余 O(1) O(1) 思路简单 效率较低

相关题目

📖 系列导航

🔥 LeetCode 位运算专题 - 查看更多精选题解

📢 关注更新:题解持续更新中,欢迎关注获取最新动态!

💬 互动交流

感谢大家耐心阅读到这里!希望这篇题解能够帮助你更好地理解和掌握这道算法题。

如果这篇文章对你有帮助,请:

  • 👍 点个赞,让更多人看到这篇文章
  • 📁 收藏文章,方便后续查阅复习
  • 🔔 关注作者,获取更多高质量算法题解
  • 💭 评论区留言,分享你的解题思路或提出疑问

你的支持是我持续分享的动力!

💡 一起进步:算法学习路上不孤单,欢迎一起交流学习!