Easy
题目描述
给定一个 32 位整数 num,返回其十六进制表示的字符串。对于负整数,使用二进制补码方法。
答案字符串中的所有字母都应该是小写字符,除了零本身之外,答案中不应该有任何前导零。
注意:不允许使用任何内置库方法直接解决此问题。
示例 1:
输入:num = 26
输出:"1a"
示例 2:
输入:num = -1
输出:"ffffffff"
约束条件:
-2³¹ <= num <= 2³¹ - 1
解题思路
这道题要求将整数转换为十六进制字符串,需要处理正数、负数和零三种情况。
核心思路:
- 位操作方法(推荐):使用位与操作提取每4位二进制位,因为十六进制每一位对应4位二进制
- 处理负数:在 Java/C++ 中,负数已经以二进制补码形式存储,直接按位处理即可
- 字符映射: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) - 只使用常量级别的额外空间 |