阿亮的算法之路——13. 罗马数字转整数

题目描述

题目描述1
题目描述2
第十二题的逆过程,还是比较简单的。

初次尝试

也是通过从高位开始往下匹配,匹配成功一个,就将这个数加相应的值,然后再匹配下一个字符。需要注意的是,匹配字符的时候,有的字符是两个同时匹配的,所以需要确定先匹配两个还是一个。

    public static int romanToInt(String s)
    {
        int[] nums = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        String[] romans = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};

        int re = 0;
        int i = 0;
        a:while (!"".equals(s))
        {
            for (; i < romans.length; i++)
            {
                if (s.length()>1)
                {
                    if (romans[i].equals(s.substring(0, 2)))
                    {
                        re += nums[i];
                        s = s.substring(2);
                        continue a;
                    }
                }
                if (romans[i].equals(s.substring(0,1)))
                {
                    re += nums[i];
                    s = s.substring(1);
                    continue a;
                }
            }
        }
        return re;
    }

有点臃肿,主要是判断边界情况。

提交结果

提交结果1

见怪不怪了,自己做的效率就那样

大佬思路

我用的是,判断一个或两个字符,是否和罗马数字相等,相等再将数字增加对应的大小。因为有的数字是两个字符,所以需要判断两位或者一位。

但其实,罗马这种数字的构造方法是有讲究的,一般都是前面代表的数,加上后面代表的数,只是一些特例情况,如:900、400、90、40、9、4等,是后面的数减去前面的数,只需要做一些简单的盘判断,然后决定是加还是减,最后得到结果。

代码
 public int romanToInt(String s) 
 {
        int sum = 0;
        int preNum = getValue(s.charAt(0));
        for(int i = 1;i < s.length(); i ++) 
        {
            int num = getValue(s.charAt(i));
            if(preNum < num) 
            { sum -= preNum; } 
            else
            { sum += preNum; }
            preNum = num;
        }
        sum += preNum;
        return sum;
    }
    
    private int getValue(char ch) 
    {
        switch(ch) 
        {
            case 'I': return 1;
            case 'V': return 5;
            case 'X': return 10;
            case 'L': return 50;
            case 'C': return 100;
            case 'D': return 500;
            case 'M': return 1000;
            default: return 0;
        }
    }
提交结果

提交结果2

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值