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

算法题目

罗马数字转整数:

罗马数字包含以下七种字符: 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.
思路:直接遍历。
/**

@author cosefy

@date 2020/7/2
*/
public class RomanToInt {
public static void main(String[] args) {
    String s = "CMCDCCIXII";//I1, V5, X10, L50, C100, D500, M1000
    System.out.println("罗马数字是:"+s);
    int rs1 = test1(s);
    System.out.println(rs1);
}
private static int test1(String s) {
    int j = 0;
    int result = 0;
    while (j < s.length()) {
        char c = s.charAt(j);
        switch (c) {
            case 'M': {
                result += 1000;
                ++j;
                break;
            }
            case 'D': {
                result += 500;
                ++j;
                break;
            }
            case 'C': {
                if ((j + 1) < s.length())
                    if (s.charAt(j + 1) == 'D') {  //C在D前面表示400
                        result += 400;
                        j += 2;
                        break;
                    } else if (s.charAt(j + 1) == 'M') { //C在M前面表示900
                        result += 900;
                        j += 2;
                        break;
                    } else {
                        result += 100;
                        ++j;
                        break;
                    }
                else {
                    result += 100;
                    ++j;
                    break;
                }
            }
            case 'L': {
                result += 50;
                ++j;
                break;
            }
            case 'X': {
                if ((j + 1) < s.length())
                    if (s.charAt(j + 1) == 'L') {  //X在L前面表示40
                        result += 40;
                        j += 2;
                        break;
                    } else if (s.charAt(j + 1) == 'C') {  //X在C前面表示90
                        result += 90;
                        j += 2;
                        break;
                    } else {
                        result += 10;
                        ++j;
                        break;
                    }
                else {
                    result += 10;
                    ++j;
                    break;
                }
            }
            case 'V': {
                result += 5;
                ++j;
                break;
            }
            case 'I': {
                if ((j + 1) < s.length())
                    if (s.charAt(j + 1) == 'V') {  //I在V前面表示4
                        result += 4;
                        j += 2;
                        break;
                    } else if (s.charAt(j + 1) == 'X') {  //I在X前面表示9
                        result += 9;
                        j += 2;
                        break;
                    } else {
                        result += 1;
                        ++j;
                        break;
                    }
                else {
                    result += 1;
                    ++j;
                    break;
                }
            }

​        }
​    }
​    return result;
}
}
posted @ 2020-07-02 13:43  cosefy  阅读(151)  评论(0编辑  收藏  举报