本站为独立的第三方备考辅导平台,与华为技术有限公司无任何官方隶属、合作或授权关系。
可信欧弟算法 · 可信备考

魔法世界的数字咒语转换

模拟入门级

题目描述

在魔法世界中,数字并不像普通世界那样简单地表示。魔法师们利用两种神秘的咒语将数字转换为独特的编码方式: · 大端表示:将数字的高位字节放置在低位地址,呈现的结果总是令人肃然起敬。 · 小端表示:将数字的高位字节放置在高位地址,展现出一种错乱却和谐的美感。 现有一个魔法输入的十进制数字(可能为负),你需要施展咒语,分别输出大端表示的结果与小端表示的结果。 注意:如果输入的数字超出了魔法范围 [-2^31, 2^32),则会引发“魔力溢出”(输出 overflow)。负数采用魔法世界的补码规则。

输入格式

一行输入:一个魔法十进制整数,可能为负数,长度范围为 [1, 32]。没有前导零。数值范围必须符合魔法规则 [-2^31, 2^32)。

输出格式

若数字在范围内: 第一行:大端表示的结果(每个字节用两位 16 进制表示,字节之间以单空格分隔)。 第二行:小端表示的结果(格式同上)。 若数字超出范围:输出字符串 overflow。

样例

输入 1
-10
输出 1
FF FF FF F6
F6 FF FF FF
说明:负数 -10 的魔法补码表示为 FF FF FF F6。大端为 FF FF FF F6,小端为 F6 FF FF FF。
输入 2
4027691818
输出 2
F0 11 B3 2A
2A B3 11 F0
输入 3
24680135791234
输出 3
overflow
说明:超出范围,输出 overflow。

题目解析

理解题目

本题以“魔法世界”为背景,要求将一个十进制整数转换成其在内存中使用的 4 字节二进制表示形式,并输出其在大端(Big-Endian)与小端(Little-Endian)字节序下的结果。核心在于:处理负数(负数以补码形式存储,需手动转为补码)、拆分为 4 个字节、每字节格式化为 2 位大写十六进制,以及合法数值必须落在 [-2^31, 2^32) 内的边界检测。

使用算法

本题并非传统意义上的“算法题”,而是考察编码与位处理:① 数值范围判断,越界直接输出 overflow;② 补码计算,负数转换为补码 补码 = (1 << 32) + 负数;③ 字节序处理,大端高位字节在前、小端低位字节在前,可借助语言内建的 to_bytes / 移位实现;④ 十六进制格式化,每个字节格式化为 2 位大写十六进制。

实现步骤

  1. 读取并转换输入为整数 int。
  2. 合法性判断:n < -2^31 或 n >= 2^32 时输出 overflow。
  3. 针对负数做补码转换:n = (1 << 32) + n。
  4. 拆出 4 个字节,分别按大端、小端顺序排列。
  5. 每个字节格式化为 2 位大写十六进制并以空格拼接输出。

参考代码

import sys

def solve(n: int) -> str:
    # 边界检测:左闭右开 [-2^31, 2^32)
    if n < -(2 ** 31) or n >= 2 ** 32:
        return "overflow"
    # 负数转补码,映射为无符号整数
    if n < 0:
        n = (1 << 32) + n
    b = n.to_bytes(4, byteorder="big")
    big = " ".join(f"{x:02X}" for x in b)
    little = " ".join(f"{x:02X}" for x in b[::-1])
    return f"{big}\n{little}"

if __name__ == "__main__":
    n = int(sys.stdin.readline().strip())
    print(solve(n))

时空复杂度

时间复杂度
O(1)
空间复杂度
O(1)

LeetCode 原题参考

免费刷真题加入科目一冲刺班