题目描述
你有一个十进制数字,请按照此规则将它变成 十六进制魔术数字:首先将它变成字母大写的十六进制字符串,然后将所有的数字 0
变成字母 O
,将数字 1
变成字母 I
。
如果一个数字在转换后只包含 {"A", "B", "C", "D", "E", "F", "I", "O"}
,那么我们就认为这个转换是有效的。
给你一个字符串 num
,它表示一个十进制数 N
,如果它的十六进制魔术数字转换是有效的,请返回转换后的结果,否则返回 "ERROR"
。
样例
输入:num = "257"
输出:"IOI"
解释:257 的十六进制表示是 101 。
输入:num = "3"
输出:"ERROR"
限制
1 <= N <= 10^12
- 给定字符串不会有前导零。
- 结果中的所有字母都应该是大写字母。
算法
(模拟) $O(n)$
- 裸的进制转换,先把字符串转成十进制,然后转十六进制。
- 转十六进制的过程中,如果出现了
2
到9
,则返回"ERROR"
。
时间复杂度
- 遍历一次字符串,故时间复杂度为 $O(n)$。
空间复杂度
- 仅需要常数的额外空间。
C++ 代码
class Solution {
public:
string toHexspeak(string num) {
unordered_map<int, char> mp;
mp[0] = 'O';
mp[1] = 'I';
for (int i = 10; i < 16; i++)
mp[i] = i - 10 + 'A';
unsigned long long n = 0;
for (char c : num)
n = n * 10 + c - '0';
string ans;
while (n) {
if (n % 16 > 1 && n % 16 < 10)
return "ERROR";
ans += mp[n % 16];
n /= 16;
}
reverse(ans.begin(), ans.end());
return ans;
}
};