LeetCode: 13. 罗马数字转整数

题目

给定一个罗马数字,将其转换成整数。

返回的结果要求在 1 到 3999 的范围内。

罗马数字

罗马数字字母

罗马数字只有7个字母组成,每个字母代码的字如下

字母数字
M1000
D500
C100
L50
X10
V5
I1

四个规则

  1. 相同的数字连写, 所表示的数等于这些数字相加得到的数。如 XXX表示 30
  2. 小的数字在大的数字的右边, 所表示的数等于这些数字相加得到的数 如VIII 表示8
  3. 小的数字(限于I, X, C)在大的数字的左边, 所表示的数等于大数减去小的数: 如IV 表示4
  4. 在一个数的上面画一条横线, 表示这个数增值1000倍(由于题目只考虑4000以内的数,所以这条规则不用考虑)。

五个组数规则

  1. I, X, C: 最多只能连用3个, 如果放在大数的左边,只能用1个。
  2. V, L, D: 不能放在大数的左边,只能使用一个。
  3. I 只能用在V和X的左边。 IV表示4, IX表示9
  4. X只能放在L,C左边。 XL 表示40, XC表示90
  5. C只能用在D, M左边。 CD 表示400, CM表示900

分析

  • 从13个罗马数字的从大到小依次判断
  • 判断字符串是否以该罗马数字开头
  • 取剩余子串继续循环

解题

class Solution {
    public int romanToInt(String s) {
        if(s.length() == 0) return 0;
        int ret = 0;
        int[] number = {1000, 900, 500, 400, 100,90, 50, 40, 10, 9, 5, 4, 1};  
        String[] roms = {"M","CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
        for(int i = 0; i < 13 && s.length() > 0; i++){   
            while(s.startsWith(roms[i])) {
                ret += number[i];
                s = s.substring(roms[i].length());
            } 
        }  
        return ret;
    }
}

启示

  • 主要是规则,可以记住罗马数字规则
  • 注意边界值的判断,如复杂边界值,可以举例试验
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值