算法练习:罗马数字转整数

解法一:

​ 先在字符串中计算特殊的情况(即小的值在左边的时候),然后在字符串中用空字符串替换掉特殊的字符串,后面再去遍历整个字符串,计算最终的结果。(这个是我自己刚开始的思路,内存和时间消耗都很大)

在这里插入图片描述

class Solution {
    public int romanToInt(String s) {
        int res = 0;
        while(s.contains("IX")||s.contains("IV")||s.contains("XL")||
                s.contains("XC")||s.contains("CD")||s.contains("CM")){
            if(s.contains("IX"))  {
                s = s.replaceFirst("IX","");
                res = res+9;
            }
            if(s.contains("IV")){
                s = s.replaceFirst("IV","");
                res = res+4;
            };
            if(s.contains("XL")){
                s = s.replaceFirst("XL","");
                res = res+40;
            }
            if(s.contains("XC")) {
                s = s.replaceFirst("XC","");
                res = res+90;
            }
            if(s.contains("CD")) {
                s = s.replaceFirst("CD", "");
                res = res+400;
            }
            if(s.contains("CM")) {
                s = s.replaceFirst("CM","");
                res = res+900;
            }
        }
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            switch (c){
                case 'I':
                    res = res + 1;
                    break;
                case 'V':
                    res = res + 5;
                    break;
                case 'X':
                    res = res + 10;
                    break;
                case 'L':
                    res = res + 50;
                    break;
                case 'C':
                    res = res + 100;
                    break;
                case 'D':
                    res = res + 500;
                    break;
                case 'M':
                    res = res + 1000;
            }
        }
        return res ;
    }
}

解法二:

直接去遍历字符串,用当前位去与下一位做比较,如果小的在大的右边,则小的那个为正数,反之,为负数。(运算速度和内存消耗显著优化)

class Solution {
    public int romanToInt(String s) {
        int sum = 0;
        int pre = getValue(s.charAt(0));
        for (int i = 1; i < s.length(); i++) {
            if(pre >= getValue(s.charAt(i))){
                sum += pre;
            }else{
                sum -= pre;
            }
            pre = getValue(s.charAt(i));
        }
        sum += pre;
        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;
        }
    }
}

在这里插入图片描述