罗马数转为整数

思路
  1. 先把所有的罗马数拆分为单个字母存入数组
  2. 遍历这个数组,如果存在罗马的特定如IV、IX、XL、XC、CD、CM则作单独判断,因为一次性判断了2个字符,所以i要加1,再continue;
  3. 最后对那些单独的字母(不符合2个字符规则的)采用自己的数值相加
注意

1、i不能够超过整个数组的限定,否则报错,所以要加判断i != strList.size() - 1或者 i+1 < s.length()

 /**
     * 罗马数转为整数  I(1), V(5), X(10), L(50),C(100),D(500) 和 M(1000)
     * @param s
     * @return
     */
    public int romanToInt(String s) {
        ArrayList<String> strList = new ArrayList<>();
        Integer sum = 0;
        for (int i = 0;i<s.length();i++){
            strList.add(s.substring(i,i+1));
        }
        for (int i = 0;i < strList.size();i++){
            if(i != strList.size() - 1 && strList.get(i).equals("I") && strList.get(i+1).equals("V")){
                sum += 4;i=i+1;continue;
            }else if(i != strList.size() - 1 && strList.get(i).equals("I") && strList.get(i+1).equals("X")){
                sum += 9;i=i+1;continue;
            }
            if(i != strList.size() - 1 && strList.get(i).equals("X") && strList.get(i+1).equals("L")){
                sum += 40;i=i+1;continue;
            }else if(i != strList.size() - 1 && strList.get(i).equals("X") && strList.get(i+1).equals("C")){
                sum += 90;i=i+1;continue;
            }
            if(i != strList.size() - 1 && strList.get(i).equals("C") && strList.get(i+1).equals("D")){
                sum += 400;i=i+1;continue;
            }else if(i != strList.size() - 1 && strList.get(i).equals("C") && strList.get(i+1).equals("M")){
                sum += 900;i=i+1;continue;
            }
            switch (strList.get(i)){
                case "I":sum += 1;break;
                case "V":sum += 5;break;
                case "X":sum += 10;break;
                case "L":sum += 50;break;
                case "C":sum += 100;break;
                case "D":sum += 500;break;
                case "M":sum += 1000;break;
            }
        }
        return sum;
    }

后来发现有更好的方法,使用hashMap把所有存在的可能性都存进去,然后符合情况的再进行判断

containsKey函数:判断是否包含指定键名
class Solution {
    public int romanToInt(String s) {
        Map<String, Integer> map = new HashMap<>();
        map.put("I", 1);
        map.put("IV", 4);
        map.put("V", 5);
        map.put("IX", 9);
        map.put("X", 10);
        map.put("XL", 40);
        map.put("L", 50);
        map.put("XC", 90);
        map.put("C", 100);
        map.put("CD", 400);
        map.put("D", 500);
        map.put("CM", 900);
        map.put("M", 1000);
        
        int ans = 0;
        for(int i = 0;i < s.length();) {
            if(i + 1 < s.length() && map.containsKey(s.substring(i, i+2))) {
                ans += map.get(s.substring(i, i+2));
                i += 2;
            } else {
                ans += map.get(s.substring(i, i+1));
                i ++;
            }
        }
        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值