资讯专栏INFORMATION COLUMN

leetcode12 十进制数转化为罗马数字

wenyiweb / 1248人阅读

摘要:这是罗马数字转为十进制数的后序题目要求将十进制数字转化为罗马数字,数值范围是在罗马数字转化为十进制数的博客中我简单的介绍了一下如何将罗马数字转化为十进制数字。

这是罗马数字转为十进制数的后序
题目要求:将十进制数字转化为罗马数字,数值范围是[1,3999]
在罗马数字转化为十进制数的博客中,我简单的介绍了一下如何将罗马数字转化为十进制数字。在这道题目里,我们需要进一步了解十进制数转换为罗马数字的协议

罗马单个数字共有7个,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)

可以被减去的值只有I(1)、X(10)、C(100),且每个值最多只可以减去一次

左减时不可以跨位数,例如99不能被表示为IC,而是XCIX

多个相同字母连续出现时表示相加,但是字母不能重复出现超过4次

综上所述,个位上的数可以由I、V、X表示出来,同理,十位上的树可以由X、L、C表示,百位上可以由C、D、M表示,千位上则为M(数字不超过3999)
所以可以分别对整数的每一位上的值进行计算,得出相应的罗马数字值,并最后合并为最终得罗马数字

思路一:遍历每一位的值转换为罗马数字

我尝试了两种数据存储方法,先尝试了map,感觉性能较差,然后尝试了array,性能的提升并不显著

    //map
    public String intToRoman(int num) {
        Map romanIntMap = new HashMap();
        romanIntMap.put(1, "I");
        romanIntMap.put(5, "V");
        romanIntMap.put(10, "X");
        romanIntMap.put(50, "L");
        romanIntMap.put(100, "C");
        romanIntMap.put(500, "D");
        romanIntMap.put(1000, "M");
        StringBuilder finalResult = new StringBuilder();
        for(int i = 1 ; num>0 ; i*=10){
            StringBuilder result = new StringBuilder("");
            int digit = num%10;

            if(digit==0){
                
            }else if(digit<=3){
                for(int j = 0 ; j0 ; i++){
            StringBuilder result = new StringBuilder("");
            int digit = num%10;
            num /= 10;
            if(digit==0){
                continue;
            }else if(digit<=3){
                for(int j = 0 ; j
思路二:穷尽枚举

因为题设中输入罗马数字是一定区间上的值,因此它的特殊情况是可以穷尽的
我们从个位入手来考虑每一位上较为特殊的情况

==9 : IX

==5 : V

==4 : IV

<4 : I*n

也就是说,由大至小减去后剩下的值都有对应的罗马数字存在

    public String intToRoman(int num) {
        int[] values = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
        String[] strs = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
    
        StringBuilder sb = new StringBuilder();
    
        for(int i=0;i= values[i]) {
                num -= values[i];
                sb.append(strs[i]);
            }
        }
        return sb.toString();
    }


想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66884.html

相关文章

  • leetcode190 Reverse Bits

    摘要:思路一比特位移动将比特位逆转过来也就是将十进制数转化为二进制数,再从右往左获得每一位上的值,再将这个值添加至结果值中。根据分治思想,逆转个比特位等价于分别将每个比特位进行逆转。 题目要求 Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in...

    赵连江 评论0 收藏0
  • leetcode190 Reverse Bits

    摘要:思路一比特位移动将比特位逆转过来也就是将十进制数转化为二进制数,再从右往左获得每一位上的值,再将这个值添加至结果值中。根据分治思想,逆转个比特位等价于分别将每个比特位进行逆转。 题目要求 Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in...

    kyanag 评论0 收藏0
  • leetcode罗马字开始

    摘要:将罗马数字转化为十进制数字上的一道简单级别的题目将罗马数字转化为对应的十进制数字,其中罗马数字的范围在这题的关键在于了解需求,及如何将罗马数字转化为对应的十进制数字罗马数字转化为十进制数字的规则为用作数字的罗马字母共有七个,即相同的数字连写 将罗马数字转化为十进制数字 Leetcode上的一道简单级别的题目将罗马数字转化为对应的十进制数字,其中罗马数字的范围在1~3999 这题的关键在...

    LiveVideoStack 评论0 收藏0
  • 据结构 单链表 LeetCode 反转链表Ⅱ 合并两个链表 二进制链表转整

    摘要:请你反转从位置到位置的链表节点,返回反转后的链表。链表中每个结点的值不是就是。已知此链表是一个整数数字的二进制表示形式。 目录 第一题:反转链表 II 解题思路: 画图解析:​ 代码实现: 第二题:合并两个链表 解题思路: 画图解析: 代码实现: 第三题:二进制链表转整数 解题思路: 画图解...

    Yang_River 评论0 收藏0
  • Leetcode 67:Add Binary(二进制求和)

    摘要:给定两个二进制字符串,返回他们的和用二进制表示。返回的数值是以开头,表明返回的数值是二进制函数用于将一个字符串或数字转换为整型。指定为非十进制时,需以字符串形式传入从第三个元素开始截取,忽略 (python、java)Given two binary strings, return their sum (also a binary string).The input strings a...

    chenjiang3 评论0 收藏0

发表评论

0条评论

阅读需要支付1元查看
<