* Solution.java
package com.leetcode.romanToInteger;
public class Solution {
public int romanToInt(String s) {
String t = "IVXLCDM";
int []weight = {1, 5, 10, 50, 100, 500, 1000};
int num = 0;
// 首次直接+, 设置一个不可能出现的最大值. 使ret > pre为false
int pre = weight.length;
for (int i = 0; i < s.length(); i++) {
int ret = t.indexOf(s.charAt(i));
if (ret < 0) {
throw new IllegalArgumentException(
"Unexcepted character '"+s.charAt(i)+"' in Roman number");
}
// IV, IX, XL, XC, CD, CM
// 4, 9, 40, 90, 400,900
if (ret > pre) {
// IX结果是4, 上一次已经加过. 如果去掉这行结果是6,
// 减掉一倍的话抵消上次结果为5, 所以需要减掉2倍上次的weight
num -= 2 * weight[pre];
}
num += weight[ret];
pre = ret;
}
return num;
}
public static void main(String[] args) {
// System.out.printf("%d\n", findChar("IVXLCDM", 'C'));
Solution s = new Solution();
String[] cases = {"III","XII", "XXVII", "IV", "XIX", "LVIII", "MCMXCIV"};
for (int i = 0; i < cases.length; i++) {
System.out.printf("%s => %d\n", cases[i], s.romanToInt(cases[i]));
}
}
}
运行结果:
III => 3
XII => 12
XXVII => 27
IV => 4
XIX => 19
LVIII => 58
MCMXCIV => 1994