Bootstrap

【Python3】【力扣题】405. 数字转换为十六进制数

【力扣题】题目描述:

题意理解:(不允许使用库函数)

数字等于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:]

;