题目大意:
十六进制魔术数字
你有一个十进制数字,请按照此规则将它变成「十六进制魔术数字」:首先将它变成字母大写的十六进制字符串,然后将所有的数字 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 。
- 结果中的所有字母都应该是大写字母。
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1271
解题思路分析:
题目难度不大,我们需要将10进制数一位一位的变换成16进制,变换方式很简单,用当前数除以16得到的余数即是16进制当前位对应的数值,然后更新当前数字变为除以16的商,重复以上步骤,直到当前数字变为0为止。其中的转化规则为:
余数为0时:当前位是O(大写字母O) 余数为1时:当前位是I(大写字母I) 余数为2-9时:当前位是2-9 余数为10时:当前位是A 余数为11时:当前位是B 余数为12时:当前位是C 余数为13时:当前位是D 余数为14时:当前位是E 余数为15时:当前位是F
按照上面的规则,可以将10进制数转化为十六进制魔术数字,如果在某一位转化时,出现余数为2-9的情况,直接返回”ERROR”即可。
实现代码:
public String toHexspeak(String num) { long n = Long.valueOf(num); // 将当前数字转化为long型 String hex=""; // 返回结果 while(n>0){ // 当n大于0时,循环获得16进制的每一位 // 当前数n与16的余数为16进制当前位的值 long remain = n % 16; if(remain==0){ hex="O"+hex; }else if(remain==1){ hex="I"+hex; }else if(remain<10){ return "ERROR"; }else if(remain==10){ hex="A"+hex; }else if(remain==11){ hex="B"+hex; }else if(remain==12){ hex="C"+hex; }else if(remain==13){ hex="D"+hex; }else if(remain==14){ hex="E"+hex; }else if(remain==15){ hex="F"+hex; } n/=16; // 当前数更新为n与16的商 } return hex; }
本题解法执行时间为1ms。
Runtime: 1 ms, faster than 100.00% of Java online submissions for Hexspeak.
Memory Usage: 35.8 MB, less than 100.00% of Java online submissions for Hexspeak.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-1271-hexspeak-解题思路分析/
《LEETCODE 1271. Hexspeak 解题思路分析》有1条回应