跳至主要內容

0405. 数字转换为十六进制数

ITCharge大约 2 分钟

0405. 数字转换为十六进制数open in new window

  • 标签:位运算、数学
  • 难度:简单

题目链接

题目大意

描述:给定一个整数 numnum

要求:编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用「补码运算」方法。

说明

  • 十六进制中所有字母(afa \sim f)都必须是小写。
  • 十六进制字符串中不能包含多余的前导零。如果要转化的数为 00,那么以单个字符 00 来表示。
  • 对于其他情况,十六进制字符串中的第一个字符将不会是 00 字符。
  • 给定的数确保在 3232 位有符号整数范围内。
  • 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。

示例

  • 示例 1:
输入:
26

输出:
"1a"
  • 示例 2:
输入:
-1

输出:
"ffffffff"

解题思路

思路 1:模拟

主要是对不同情况的处理。

  • numnum 为 0 时,直接返回 00
  • numnum 为负数时,对负数进行「补码运算」,转换为对应的十进制正数(将其绝对值与 23212^{32} - 1 异或再加 1),然后执行和 numsnums 为正数一样的操作。
  • numnum 为正数时,将其对 1616 取余,并转为对应的十六进制字符,并按位拼接到字符串中,再将 numnum 除以 1616,继续对 1616 取余,直到 numnum 变为为 0。
  • 最后将拼接好的字符串逆序返回就是答案。

思路 1:代码

class Solution:
    def toHex(self, num: int) -> str:
        res = ''
        if num == 0:
            return '0'
        
        if num < 0:
            num = (abs(num) ^ (2 ** 32 - 1)) + 1
        
        while num:
            digit = num % 16
            if digit >= 10:
                digit = chr(ord('a') + digit - 10)
            else:
                digit = str(digit)
            res += digit
            num >>= 4
        return res[::-1]

思路 1:复杂度分析

  • 时间复杂度O(C)O(C),其中 CC 为构造的十六进制数的长度。
  • 空间复杂度O(C)O(C)