1271. 十六进制魔术数字
大约 2 分钟
---
1271. 十六进制魔术数字
- 标签:数学、字符串
- 难度:简单
题目链接
题目大意
描述:将一个十进制数字先转成字母大写的十六进制字符串,然后将数字 变成字母 ,数字 变成字母 。如果转换后的结果只包含 {"A", "B", "C", "D", "E", "F", "I", "O"},就认为转换有效。
要求:给你一个字符串 表示一个十进制数 ,返回转换后的结果,如果无效则返回 "ERROR"。
说明:
- 。
- 给定字符串不会有前导 。
- 结果中的所有字母都应该是大写字母。
示例:
- 示例 1:
输入:num = "257"
输出:"IOI"
解释:257 的十六进制表示是 101 。- 示例 2:
输入:num = "3"
输出:"ERROR"解题思路
思路 1:模拟
1. 核心思想
按题目描述一步步做:
- 十进制字符串 → 整数 → 十六进制大写字符串。
- 遍历十六进制字符串,将
'0'替换为'O','1'替换为'I'。 - 检查替换后的字符串是否只包含合法的字符(
A-F、I、O),如果包含其他数字(2-9)则返回"ERROR"。
2. 具体步骤
第 1 步:将字符串 通过 int() 转为整数,再用 hex() 转为十六进制字符串(格式为 '0x...')。
第 2 步:去掉开头的 '0x',并将字母转为大写。
第 3 步:遍历每个字符:
- 如果是
'0',替换为'O'。 - 如果是
'1',替换为'I'。 - 如果是
'2'-'9',返回"ERROR"。 - 如果是
'A'-'F',保留。
第 4 步:返回转换后的字符串。
结合示例走一遍:
: 的十六进制是 ,去掉前缀大写后为 "101"。遍历:'1'→'I','0'→'O','1'→'I',得到 "IOI"。
:十六进制为 "3",'3' 不在合法字符集中,返回 "ERROR"。
思路 1:代码
class Solution:
def toHexspeak(self, num: str) -> str:
# 转为十六进制大写字符串
hex_str = hex(int(num))[2:].upper()
ans = []
for ch in hex_str:
if ch == '0':
ans.append('O')
elif ch == '1':
ans.append('I')
elif ch in "23456789":
# 包含非法数字
return "ERROR"
else:
# A-F 直接保留
ans.append(ch)
return ''.join(ans)思路 1:复杂度分析
- 时间复杂度:,其中 是输入的十进制数。十六进制字符串的长度约为 ,遍历时间与位数成正比。
- 空间复杂度:,需要存储十六进制字符串和结果字符串。