十六进制魔术数字
难度:
标签:
题目描述
代码结果
运行时间: 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',这个前缀对最终结果有什么影响吗?
▷🦆
在替换'0'和'1'为'O'和'I'后,如何确保替换不会影响其他十六进制字符的正确性?
▷🦆
你是如何决定只检查字符串中的{'A', 'B', 'C', 'D', 'E', 'F', 'I', 'O'}字符集,是否有特定的原因或规则支持这个决定?
▷🦆
如果输入的整数非常大,例如超过标准整型范围,这种方法是否还有效,或者需要特别注意什么?
▷