Easy

题目描述

给定一个 32 位整数 num,返回其十六进制表示的字符串。对于负整数,使用二进制补码方法。

答案字符串中的所有字母都应该是小写字符,除了零本身之外,答案中不应该有任何前导零。

注意:不允许使用任何内置库方法直接解决此问题。

示例 1:

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

示例 2:

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

约束条件:

  • -2³¹ <= num <= 2³¹ - 1

解题思路

这道题要求将整数转换为十六进制字符串,需要处理正数、负数和零三种情况。

核心思路:

  1. 位操作方法(推荐):使用位与操作提取每4位二进制位,因为十六进制每一位对应4位二进制
  2. 处理负数:在 Java/C++ 中,负数已经以二进制补码形式存储,直接按位处理即可
  3. 字符映射:0-9 对应 ‘0’-‘9’,10-15 对应 ‘a’-‘f’

详细步骤:

  • 特殊处理:如果 num 为 0,直接返回 “0”
  • 从低位到高位,每次取最低 4 位(num & 15)
  • 将这 4 位转换为对应的十六进制字符
  • 右移 4 位继续处理下一组
  • 由于是从低位开始处理,最后需要反转结果

时间复杂度优化: 最多处理 8 次(32位÷4位),时间复杂度为 O(1)。

代码实现

class Solution {
public:
    string toHex(int num) {
        if (num == 0) return "0";
        
        string chars = "0123456789abcdef";
        string result = "";
        
        // 使用 unsigned int 处理负数的二进制补码
        unsigned int unum = num;
        
        while (unum != 0) {
            result = chars[unum & 15] + result;
            unum >>= 4;
        }
        
        return result;
    }
};
class Solution:
    def toHex(self, num: int) -> str:
        if num == 0:
            return "0"
        
        chars = "0123456789abcdef"
        result = ""
        
        # Python 中负数需要转换为 32 位无符号整数
        if num < 0:
            num = 2**32 + num
        
        while num:
            result = chars[num & 15] + result
            num >>= 4
        
        return result
public class Solution {
    public string ToHex(int num) {
        if (num == 0) return "0";
        
        string chars = "0123456789abcdef";
        string result = "";
        
        // 使用 uint 处理负数的二进制补码
        uint unum = (uint)num;
        
        while (unum != 0) {
            result = chars[unum & 15] + result;
            unum >>= 4;
        }
        
        return result;
    }
}
var toHex = function(num) {
    if (num === 0) return "0";
    
    if (num < 0) {
        num = (1 << 32) + num;
    }
    
    const hexChars = "0123456789abcdef";
    let result = "";
    
    while (num > 0) {
        result = hexChars[num & 15] + result;
        num >>>= 4;
    }
    
    return result;
};

复杂度分析

复杂度分析
时间复杂度O(1) - 最多处理 8 次循环(32位÷4位)
空间复杂度O(1) - 只使用常量级别的额外空间