leetcode
leetcode 1051 ~ 1100
十六进制魔术数字

十六进制魔术数字

难度:

标签:

题目描述

代码结果

运行时间: 28 ms, 内存: 0.0 MB


/*
题目思路:
我们需要将一个十进制数转换为十六进制格式。虽然可以直接使用标准库方法完成,但我们也可以尝试用流的方式完成,尽管流对于这个任务不是最佳选择。
我们将十进制数转换为二进制形式,然后将其每四个二进制位转换为一个十六进制字符。
*/
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class HexadecimalMagicNumberStream {
    public String toHex(int num) {
        if (num == 0) return "0";
        // 生成二进制字符串
        String binaryString = Integer.toBinaryString(num);
        // 计算所需的前导零数量,使得二进制字符串长度为4的倍数
        int leadingZeros = (4 - binaryString.length() % 4) % 4;
        binaryString = "0".repeat(leadingZeros) + binaryString;
        // 将每4个二进制位映射为一个十六进制字符
        return IntStream.range(0, binaryString.length() / 4)
                .mapToObj(i -> binaryString.substring(i * 4, i * 4 + 4))
                .map(s -> Integer.parseInt(s, 2))
                .map(n -> Integer.toHexString(n))
                .collect(Collectors.joining());
    }
}

解释

方法:

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

时间复杂度:

O(log n)

空间复杂度:

O(log n)

代码细节讲解

🦆
为什么在转换十六进制字符串时需要去除前缀'0x',这个前缀对最终结果有什么影响吗?
在Python中,使用hex()函数将整数转换为十六进制字符串时,返回的字符串以'0x'开头,这是十六进制数的通用前缀,用于区分十进制和十六进制数字。然而,在本题的特定上下文中,我们只需要纯粹的十六进制数字字符,不需要这个前缀。如果保留'0x',则会干扰后续的字符替换逻辑和最终的格式检查,因为'0x'并不属于题目要求的{'A', 'B', 'C', 'D', 'E', 'F', 'I', 'O'}字符集。
🦆
在替换'0'和'1'为'O'和'I'后,如何确保替换不会影响其他十六进制字符的正确性?
在十六进制表示中,除'0'和'1'之外的字符是'A'到'F'。当我们将'0'和'1'分别替换为'O'和'I'时,这些替换不会与'A'到'F'冲突,因为'O'和'I'并不在十六进制的原始字符集('A'至'F', '0'至'9')中。因此,这种替换只会影响原本为'0'和'1'的字符,而不会错误地修改其他字符。
🦆
你是如何决定只检查字符串中的{'A', 'B', 'C', 'D', 'E', 'F', 'I', 'O'}字符集,是否有特定的原因或规则支持这个决定?
这个字符集的选择是基于题目要求的特殊十六进制表示。普通的十六进制数由{'0'至'9', 'A'至'F'}组成,但题目要求将'0'和'1'分别替换为'O'和'I'。替换后,有效的字符集就变为{'A', 'B', 'C', 'D', 'E', 'F', 'I', 'O'}。这种检查确保替换后的字符串完全符合题目的要求,没有包含非法字符。
🦆
如果输入的整数非常大,例如超过标准整型范围,这种方法是否还有效,或者需要特别注意什么?
在Python中,整数类型(int)是动态的,可以处理任意大小的数(只受限于机器的内存限制),因此即使输入的整数超过了标准的32位或64位整型范围,该方法仍然有效。不需要特别注意整数的大小限制。但是,应注意程序的内存使用和处理大数时的性能,特别是在大数据量或高性能要求的环境中。

相关问题