【力扣题】题目描述:
题意理解:(不允许使用库函数)
数字等于0,则结果为0,
数字小于0,则补码运算,即最高位(32位)为1,其余全部取反,再加1。相当于2的32次方+负数。
数字大于0,则计算十六进制(解题思路里详细说明)。
注:十六进制:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f。
(在ASCII码,a对应97)
【Python3】代码:
1、解题思路:基于“题意理解”,数字大于0,求与16的余数,小于10则直接字符串,大于等于10,转为小写字母。与16的商继续求余数,直到数字为0。
知识点:num % 16:求与16的余数,即num除以16的余数。
str(...):转为字符串。
chr(...):将整数转为ASCII中对应字符。
[ ]:空列表。列表:有序、元素可重复、可变的序列。
列表.append(...):往列表末尾中添加元素。
列表.reverse( ):列表倒置,即列表起始元素在末尾,末尾元素在起始位置。
"间隔符".join(列表):将列表转为字符串。间隔符可以为空。
class Solution:
def toHex(self, num: int) -> str:
if num == 0: return "0"
# 负数:(补码运算)最高位为1,其余全部取反再加1
# (32位)相当于:2的32次方-负数的绝对值,即2的32次方+负数
if num < 0: num += 2 ** 32
res = []
while num != 0:
# 依次求余数
m = num % 16
# 余数小于10则直接转为字符串
if m < 10: astr = str(m)
# 余数大于等于10,则转为对应小写字母,(97对应小写字母a)
else: astr = chr(m - 10 + 97)
res.append(astr)
# 求商,继续下一轮求余数
num = num // 16
# 结果列表倒置
res.reverse()
return ''.join(res)
2、解题思路:一个十六进制位对应4个二进制位。32位二进制,即8位十六进制,从高到低(从左到右),依次将数字右移4位的倍数与十六进制最大值f进行与运算,依次获得对应的十六进制位。
知识点:num >> n:num二进制右移n位。
num & 15:num与15(即十六进制最大值f)进行二进制与运算。二进制位依次与运算,相同为1,其余为0。依次获得一位十六进制位。
class Solution:
def toHex(self, num: int) -> str:
if num == 0: return "0"
res = []
for i in range(7,-1,-1):
# 二进制右移,与16进制最大值f求与运算,依次获取一个16进制位
val = (num >> (4 * i)) & 15
if len(res) > 0 or val > 0:
# 小于10则转为字符串,大于等于10则转为对应字母
astr = f"{val}" if val < 10 else f"{chr(val - 10 + 97)}"
res.append(astr)
return ''.join(res)
3、补充:使用库函数,不在本题解题范围之内(本题不允许使用库函数)
(3-1)解题思路:python中库函数format可以将整数转为十六进制。
知识点:1 << 32:1左移32位,相当于2的32次方即2 ** 32。
format(...):字符串格式化。'Ox'是十六进制的开头标识。
class Solution:
def toHex(self, num: int) -> str:
# 小于0,补码运算
if num < 0: num += (1 << 32)
# 其余,使用format函数转换
return format(num, '0x')
(3-2)解题思路:python中库函数hex可以将十进制转为十六进制。
知识点:hex(...):将十进制转为十六进制。返回结果中含开头标识'Ox'。
序列[2:]:序列(字符串、列表等)中获取从下标2(含)到最后的元素。下标从0开始。
class Solution:
def toHex(self, num: int) -> str:
# 小于0,补码运算
if num < 0: num += (1 << 32)
# 其余,使用hex函数转换,去除开头标识'Ox'
return hex(num)[2:]