13. Roman to Integer

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

Solution:

参考罗马数字对照表:
http://wenku.baidu.com/link?url=zwrIO9Ezhj6N3vZKh1r6F8kHjgMpkbwrOFuv3Hw4-yYM45Y3hin1jfXpu6C43iF0mggRUxAxq6-v4ycY45Y3z7v2bGKvLbEvo6tZNjYXYCi

字母的值如下:

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

Only need to note that for I, X and C, these three letters can be placed before other letters to form subtraction. 只有 I, X, C 可以放在其他字母前面来做减法

I 只会出现在 V 前面表示 V(5)- n * 1
X 只会出现在 L 前面表示 L(50)- n * 10
C 只会出现在 D 前面表示 D(500)- n * 100

处理罗马数字的字符串的思路是:
从右往左逐个字母累加,
如果当前累加的和大于等于5的时候遇到 I,说明该 I 前面必有 V,则该 I 表示 -1 而非 +1;
如果当前累加的和大于等于50的时候遇到 X,说明该 X 前面必有 L,则该 X 表示 -10 而非 +10
如果当前累加的和大于等于500的时候遇到 C,说明该 C 前面必有 D,则该 C 表示 -100 而非 +100

public class Solution 
{
    public int romanToInt(String s) 
    {
        int length = s.length();
        int value = 0;
        for(int i = length - 1; i >= 0; i--)
        {
            switch(s.charAt(i))
            {
                case 'I':
                    value += (value >= 5 ? -1 : 1);
                    break;
                case 'V':
                    value += 5;
                    break;
                case 'X':
                    value += (value >= 50 ? -10 : 10);
                    break;
                case 'L':
                    value += 50;
                    break;
                case 'C':
                    value += (value >= 500 ? -100 : 100);
                    break;
                case 'D':
                    value += 500;
                    break;
                case 'M':
                    value += 1000;
                    break;
            }
        }
        return value;
    }
}

你可能感兴趣的:(13. Roman to Integer)