你有一个十进制数字,请按照此规则将它变成「十六进制魔术数字」:首先将它变成字母大写的十六进制字符串,然后将所有的数字 0
变成字母 O
,将数字 1
变成字母 I
。
如果一个数字在转换后只包含 {"A", "B", "C", "D", "E", "F", "I", "O"}
,那么我们就认为这个转换是有效的。
给你一个字符串 num
,它表示一个十进制数 N
,如果它的十六进制魔术数字转换是有效的,请返回转换后的结果,否则返回 "ERROR"
。
示例 1:
输入:num = "257"
输出:"IOI"
解释:257 的十六进制表示是 101 。
示例 2:
输入:num = "3"
输出:"ERROR"
提示:
1 <= N <= 10^12
- 给定字符串不会有前导 0 。
- 结果中的所有字母都应该是大写字母。
C++
class Solution {
public:
string toHexspeak(string num)
{
long long tmp=0;
for(auto c:num)
{
tmp=tmp*10+(c-'0');
}
string res;
while(tmp)
{
int c=tmp%16;
if(c==10)
{
res+='A';
}
else if(c==11)
{
res+='B';
}
else if(c==12)
{
res+='C';
}
else if(c==13)
{
res+='D';
}
else if(c==14)
{
res+='E';
}
else if(c==15)
{
res+='F';
}
else
{
res+=to_string(c);
}
tmp/=16;
}
reverse(res.begin(),res.end());
for(int i=0;i<res.size();i++)
{
if('0'==res[i])
{
res[i]='O';
}
else if('1'==res[i])
{
res[i]='I';
}
}
map<char,int> vec;
vec['A']=1;
vec['B']=1;
vec['C']=1;
vec['D']=1;
vec['E']=1;
vec['F']=1;
vec['I']=1;
vec['O']=1;
for(auto c:res)
{
if(0==vec[c])
{
return "ERROR";
}
}
return res;
}
};