[TOC]
P013 Roman to Integer
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
思路分析
羅馬數(shù)字的元數(shù)字如下:
羅馬字符 | I | V | X | L | C | D | M |
---|---|---|---|---|---|---|---|
阿拉伯數(shù)字 | 1 | 5 | 10 | 50 | 100 | 500 | 1000 |
幾個規(guī)律:
- 相同的數(shù)字連寫、所表示的數(shù)等于這些數(shù)字相加得到的數(shù)、如:Ⅲ=3;
- 小的數(shù)字在大的數(shù)字的右邊祷肯、所表示的數(shù)等于這些數(shù)字相加得到的數(shù)、 如:Ⅷ=8汹来、Ⅻ=12贼穆;
- 小的數(shù)字、(限于 Ⅰ坯临、X 和 C)在大的數(shù)字的左邊搂抒、所表示的數(shù)等于大數(shù)減小數(shù)得到的數(shù)艇搀、如:Ⅳ=4、Ⅸ=9求晶;
- 正常使用時焰雕、連寫的數(shù)字重復不得超過三次;
思路
- 從左往右掃描輸入字符串
- 找到對應的字母對應的數(shù)字相加即可
- 有以上幾個規(guī)律限制
- 當前處理的字符對應的數(shù)字比前一個小芳杏,正常相加即可矩屁。
- 當前處理的字符對應的數(shù)字比前一個大,加上當前數(shù)爵赵,在減去前一個數(shù)的2倍
VI==>5+1==6
VII==>5+1+1==7
IV==>1+5-2==4
代碼
java
public class Solution013 {
public static int[] base = new int['X' + 1];
static {
for (int i = 0; i < base.length; i++)
base[i] = 0;
base['I'] = 1;
base['V'] = 5;
base['X'] = 10;
base['L'] = 50;
base['C'] = 100;
base['D'] = 500;
base['M'] = 1000;
}
public int romanToInt(String s) {
if (s == null || s.trim().length() == 0)
return 0;
int ret = base[s.charAt(0)];
for (int i = 1; i < s.toCharArray().length; i++) {
int current = base[s.charAt(i)];
int prev = base[s.charAt(i - 1)];
if (prev >= current)
ret += current;
else
ret += current - 2 * prev;
}
return ret;
}
public static void main(String[] args) {
Solution013 s13 = new Solution013();
String ss[] = { "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X" };
for (String s : ss) {
System.out.println(s + "--->" + s13.romanToInt(s));
}
}
}