2019-10-16-罗马数字转整数

题目描述

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

    I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
    X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
    C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

示例 1:

输入: "III"
输出: 3

示例 2:

输入: "IV"
输出: 4

示例 3:

输入: "IX"
输出: 9

示例 4:

输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.

示例 5:

输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

解法思路

列出所有情况,大量调用string.replace()方法去修改字符串

示例代码

package easy;

import org.junit.Test;

import java.util.*;

/**
 * 罗马数字转整数
 */
public class E13 {
    public static int romanToInt(String s) {
        int sum =0;
        while (s.length()>0){
            if (s.contains("IV")){
                sum+=4;
                s = s.replace("IV","");
            }
            if (s.contains("IX")){
                sum+=9;
                s = s.replace("IX","");
            }
            if (s.contains("III")) {
                sum+=3;
                s = s.replace("III","");
            }
            if (s.contains("II")){
                sum+=2;
                s = s.replace("II","");
            }
            if (s.contains("I")){
                sum+=1;
                s = s.replace("I","");
            }
            if (s.contains("V")){
                sum+=5;
                s = s.replace("V","");
            }
            if (s.contains("XL")){
                sum+=40;
                s = s.replace("XL","");
            }
            if (s.contains("XC")){
                sum+=90;
                s = s.replace("XC","");
            }
            if (s.contains("XXX")){
                sum+=30;
                s = s.replace("XXX","");
            }
            if (s.contains("XX")){
                sum+=20;
                s = s.replace("XX","");
            }
            if (s.contains("X")){
                sum+=10;
                s = s.replace("X","");
            }
            if (s.contains("L")){
                sum+=50;
                s = s.replace("L","");
            }
            //100- 900
            if (s.contains("CD")){
                sum+=400;
                s = s.replace("CD","");
            }
            if (s.contains("CM")){
                sum+=900;
                s = s.replace("CM","");
            }
            if (s.contains("CCC")){
                sum+=300;
                s = s.replace("CCC","");
            }
            if (s.contains("CC")){
                sum+=200;
                s = s.replace("CC","");
            }
            if (s.contains("C")){
                sum+=100;
                s = s.replace("C","");
            }
            if (s.contains("D")){
                sum+=500;
                s = s.replace("D","");
            }
            if (s.contains("MMM")){
                sum+=3000;
                s = s.replace("MMM","");
            }
            if (s.contains("MM")){
                sum+=2000;
                s = s.replace("MM","");
            }
            if (s.contains("M")){
                sum+=1000;
                s = s.replace("M","");
            }


        }
        return sum;

    }

    public static void main(String[] agrs){
        String s = "MMCCCXCIX";
        int out = romanToInt(s);
        System.out.println(out);

    }
}

运行结果

通过

执行结果: 通过 显示详情 执行用时 :27 ms, 在所有 java 提交中击败了28.24% 的用户 内存消耗 :38.9 MB, 在所有 java 提交中击败了85.53%的用户

一个坑

java的String类的replace()方法返回的是一个新的String对象,需要重新赋值回去,否则,s的值不更新

优化思路

加入大量的终结判断

class Solution {
    public int romanToInt(String s) {
        int sum =0;
        while (s.length()>0){
            if (s.contains("IV")){
                sum+=4;
                s = s.replace("IV","");
            }else
            if (s.contains("IX")){
                sum+=9;
                s = s.replace("IX","");
            }else
            if (s.contains("III")) {
                sum+=3;
                s = s.replace("III","");
            }else
            if (s.contains("II")){
                sum+=2;
                s = s.replace("II","");
            }else
            if (s.contains("I")){
                sum+=1;
                s = s.replace("I","");
            }else
            if (s.contains("V")){
                sum+=5;
                s = s.replace("V","");
            }
            if (s.contains("XL")){
                sum+=40;
                s = s.replace("XL","");
            }else
            if (s.contains("XC")){
                sum+=90;
                s = s.replace("XC","");
            }else
            if (s.contains("XXX")){
                sum+=30;
                s = s.replace("XXX","");
            }else
            if (s.contains("XX")){
                sum+=20;
                s = s.replace("XX","");
            }else
            if (s.contains("X")){
                sum+=10;
                s = s.replace("X","");
            }else
            if (s.contains("L")){
                sum+=50;
                s = s.replace("L","");
            }
            //100- 900
            if (s.contains("CD")){
                sum+=400;
                s = s.replace("CD","");
            }else
            if (s.contains("CM")){
                sum+=900;
                s = s.replace("CM","");
            }else
            if (s.contains("CCC")){
                sum+=300;
                s = s.replace("CCC","");
            }else
            if (s.contains("CC")){
                sum+=200;
                s = s.replace("CC","");
            }else
            if (s.contains("C")){
                sum+=100;
                s = s.replace("C","");
            }else
            if (s.contains("D")){
                sum+=500;
                s = s.replace("D","");
            }
            if (s.contains("MMM")){
                sum+=3000;
                s = s.replace("MMM","");
            }else
            if (s.contains("MM")){
                sum+=2000;
                s = s.replace("MM","");
            }else
            if (s.contains("M")){
                sum+=1000;
                s = s.replace("M","");
            }
        }
        return sum;
    }
}

执行结果: 通过 显示详情 执行用时 :24 ms, 在所有 java 提交中击败了36.07% 的用户 内存消耗 :39.5 MB, 在所有 java 提交中击败了77.71%的用户