0405. 数字转换为十六进制数【简单】
1. 📝 题目描述
给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。
答案字符串中的所有字母都应该是小写字符,并且除了 0 本身之外,答案中不应该有任何前置零。
注意: 不允许使用任何由库提供的将数字直接转换或格式化为十六进制的方法来解决这个问题。
示例 1:
txt
输入:num = 26
输出:"1a"1
2
2
示例 2:
txt
输入:num = -1
输出:"ffffffff"1
2
2
提示:
-2^31 <= num <= 2^31 - 1
2. 🎯 s.1 - 暴力解法
js
/**
* @param {number} num
* @return {string}
*/
var toHex = function (num) {
// 特殊情况:0
if (num === 0) return '0'
// 十六进制字符映射
const hexChars = '0123456789abcdef'
let result = ''
// 对于负数,转换为32位无符号整数
// 使用无符号右移0位来获取补码表示
let n = num >>> 0
// 每次取最低4位,转换为十六进制字符
while (n > 0) {
result = hexChars[n & 15] + result
n >>>= 4 // 无符号右移4位
}
return result
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- 时间复杂度:
,因为整数最多 32 位,最多只需要 8 次循环 - 空间复杂度:
,只使用了常数级别的额外空间 - 执行过程示例
txt
1. 26 & 15 = 10,对应字符 'a'
2. 26 >>> 4 = 1
3. 1 & 15 = 1,对应字符 '1'
4. 1 >>> 4 = 0,循环结束
5. 结果为 '1a'1
2
3
4
5
2
3
4
5
txt
1. -1 >>> 0 = 4294967295 (32 位无符号整数)
2. 4294967295 & 15 = 15,对应字符 'f'
3. 继续右移 4 位,总共 8 次得到 'ffffffff'1
2
3
2
3
3. 🤔 JS 中的 >>> 0 是什么?
>>>是 无符号右移运算符(Zero-fill right shift)- 它会把数字当作 32 位无符号整数 来处理
- 右移 0 位 → 数值不变,但类型语义变了
- 举个例子:
js
console.log(-1 >>> 0) // 输出:42949672951
- 为什么?
-1的 32 位补码是:11111111 11111111 11111111 11111111- 当你用
>>> 0,JS 把它解释为无符号整数 - 二进制
11111111111111111111111111111111= 2³² - 1 = 4294967295
4. 🔗 引用
- 补码运算
- 百度百科