X

LEETCODE 1271. Hexspeak 解题思路分析

题目大意:

十六进制魔术数字

你有一个十进制数字,请按照此规则将它变成「十六进制魔术数字」:首先将它变成字母大写的十六进制字符串,然后将所有的数字 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-解题思路分析/
Categories: leetcode
kwantong:

View Comments (1)