十六进制魔术数字

Submission

运行时间: 28 ms

内存: 0.0 MB

class Solution:
    def toHexspeak(self, num: str) -> str:
        res = ""
        num = str(hex(int(num))[2:])
        num = num.upper().replace('0', 'O').replace('1', 'I')
        
        if [i for i in num if i not in {"A", "B", "C", "D", "E", "F", "I", "O"}] != []:
            return 'ERROR'
        
        else:
            return num

Explain

此题解首先将输入的字符串num转换为整数,然后将该整数转换为十六进制表示,剔除前缀'0x'。接着,将十六进制数转换为大写,并将所有的'0'替换为'O',所有的'1'替换为'I',以符合题目要求的特殊十六进制表达。最后,检查转换后的字符串是否只包含{'A', 'B', 'C', 'D', 'E', 'F', 'I', 'O'}这些字符,如果包含其他字符,则返回'ERROR';否则返回转换后的字符串。

时间复杂度: O(log n)

空间复杂度: O(log n)

class Solution:
    def toHexspeak(self, num: str) -> str:
        # 初始化结果变量
        res = ""
        # 将字符串转换为整数,并转换为十六进制去掉前缀'0x'
        num = str(hex(int(num))[2:])
        # 转为大写并替换'0'和'1'
        num = num.upper().replace('0', 'O').replace('1', 'I')
        
        # 检查是否只包含允许的字符
        if [i for i in num if i not in {"A", "B", "C", "D", "E", "F", "I", "O"}] != []:
            return 'ERROR'
        
        else:
            return num

Explore

在Python中,使用hex()函数将整数转换为十六进制字符串时,返回的字符串以'0x'开头,这是十六进制数的通用前缀,用于区分十进制和十六进制数字。然而,在本题的特定上下文中,我们只需要纯粹的十六进制数字字符,不需要这个前缀。如果保留'0x',则会干扰后续的字符替换逻辑和最终的格式检查,因为'0x'并不属于题目要求的{'A', 'B', 'C', 'D', 'E', 'F', 'I', 'O'}字符集。

在十六进制表示中,除'0'和'1'之外的字符是'A'到'F'。当我们将'0'和'1'分别替换为'O'和'I'时,这些替换不会与'A'到'F'冲突,因为'O'和'I'并不在十六进制的原始字符集('A'至'F', '0'至'9')中。因此,这种替换只会影响原本为'0'和'1'的字符,而不会错误地修改其他字符。

这个字符集的选择是基于题目要求的特殊十六进制表示。普通的十六进制数由{'0'至'9', 'A'至'F'}组成,但题目要求将'0'和'1'分别替换为'O'和'I'。替换后,有效的字符集就变为{'A', 'B', 'C', 'D', 'E', 'F', 'I', 'O'}。这种检查确保替换后的字符串完全符合题目的要求,没有包含非法字符。

在Python中,整数类型(int)是动态的,可以处理任意大小的数(只受限于机器的内存限制),因此即使输入的整数超过了标准的32位或64位整型范围,该方法仍然有效。不需要特别注意整数的大小限制。但是,应注意程序的内存使用和处理大数时的性能,特别是在大数据量或高性能要求的环境中。