题目链接: https://leetcode.com/problems/roman-to-integer/description/

题目描述:

Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.

Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

For example, two is written as II in Roman numeral, just two one's added together. Twelve is written as, XII, which is simply X + II. The number twenty seven is written as XXVII, which is XX + V + II.

Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:

  • I can be placed before V (5) and X (10) to make 4 and 9. 
  • X can be placed before L (50) and C (100) to make 40 and 90. 
  • C can be placed before D (500) and M (1000) to make 400 and 900.

Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.

Example 1:

Input: "III"
Output: 3

Example 2:

Input: "IV"
Output: 4

Example 3:

Input: "IX"
Output: 9

Example 4:

Input: "LVIII"
Output: 58
Explanation: C = 100, L = 50, XXX = 30 and III = 3.

Example 5:

Input: "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

 

题目提示:

提示1:

 

I - 1
V - 5
X - 10
L - 50
C - 100
D - 500
M - 1000

提示2:

Rules:
* If I comes before V or X, subtract 1 eg: IV = 4 and IX = 9
* If X comes before L or C, subtract 10 eg: XL = 40 and XC = 90
* If C comes before D or M, subtract 100 eg: CD = 400 and CM = 900

我们可以观察出规律并得出算法思路:

 

  • 先初始化一个长度和字符个数相等的整型数组
  • 遍历每个字符解析到对应的数值
  • 重新遍历一次,如果前面的比后面的,就将前面的和减去后面的值否则相加。

代码:

 /**
     * 罗马数字转数字
     *
     * @param s 罗马数字字符串
     * @return 数字
     */
    public int romanToInt(String s) {
        //存放每个罗马字母对应的数值
        int[] numbers = new int[s.length()];

        for (int i = 0; i < s.length(); i++) {
            switch (s.charAt(i)) {
                case 'M':
                    numbers[i] = 1000;
                    break;
                case 'D':
                    numbers[i] = 500;
                    break;
                case 'C':
                    numbers[i] = 100;
                    break;
                case 'L':
                    numbers[i] = 50;
                    break;
                case 'X':
                    numbers[i] = 10;
                    break;
                case 'V':
                    numbers[i] = 5;
                    break;
                case 'I':
                    numbers[i] = 1;
                    break;
                default:
            }
        }

        int sum = 0;
        for (int i = 0; i < numbers.length - 1; i++) {
            if (numbers[i] < numbers[i + 1]) {
                sum -= numbers[i];
            } else {
                sum += numbers[i];
            }
        }

        return sum + numbers[numbers.length - 1];
    }

需要特别注意的是根据《阿里巴巴Java编程规范》 1.7控制语句 这一节的 第一条所示:

LeetCode 13. Roman to Integer 罗马数字转整数_i++

上面的switch块内,需要加上一个default语句。

另外顺便推荐大家多看看编程规范,养成好习惯。