题目
难度:★☆☆☆☆
类型:数学
给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。
注意
十六进制中所有字母(a-f)都必须是小写。
十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符'0'来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。
给定的数确保在32位有符号整数范围内。
不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。
示例
示例 1:
输入:
26
输出:
"1a"
示例 2:
输入:
-1
输出:
"ffffffff"
解答
这是计算机基础题,我们需要对计算机数据存储和表示方式有一定了解。在计算机中,整形变量正数的补码就是自己,负数的补码是除符号位外,各位取反,然后总体+1,因此我们应该区别对待:
输入正数,经典数制转换,通过循环对16取余获得结果;
输入零,返回零;
输入负数,需要先将数字转换为补码形式,再按照正数进行数制转换。
这里我们构造了十进制与十六进制转换字典,
{0: '0',
1: '1',
2: '2',
3: '3',
4: '4',
5: '5',
6: '6',
7: '7',
8: '8',
9: '9',
10: 'a',
11: 'b',
12: 'c',
13: 'd',
14: 'e',
15: 'f'}
编码流程如下:
class Solution(object):
def toHex(self, num):
"""
:type num: int
:rtype: str
"""
# 构造十进制与十六进制的转换字典
dec2hex = {**{i: str(i) for i in range(0, 10)}, **{i: chr(87+i) for i in range(10, 16)}}
# 如果输入负数,要变成其补码形式,各位取反再+1
if num < 0:
num = int(''.join([str(1 - int(i)) for i in list(bin(-num)[2:].zfill(32))]), base=2)+1
# 如果输入零
elif num == 0:
return '0'
# 如果输入正数
res = ''
while num:
r, num = num % 16, num // 16 # num除以16得到余数和商
res = dec2hex[r] + res # 余数通过对应关系转换为16进制数,并加到结果最高位
return res # 返回最终结果
如有疑问或建议,欢迎评论区留言~