Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
翻译:罗马数字转换为整数
Code:
import java.util.HashMap;
import java.util.Map;
/**
* @author MohnSnow
* @time 2015年6月3日 下午3:16:46
*
*/
public class LeetCode13 {
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * @param argsmengdx
<span style="white-space:pre"> </span> * -fnst
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>/*
<span style="white-space:pre"> </span> * test:
<span style="white-space:pre"> </span> * 个位数举例
<span style="white-space:pre"> </span> * Ⅰ,1 】Ⅱ,2】 Ⅲ,3】 Ⅳ,4 】Ⅴ,5 】Ⅵ,6】Ⅶ,7】 Ⅷ,8 】Ⅸ,9 】
<span style="white-space:pre"> </span> * 十位数举例
<span style="white-space:pre"> </span> * Ⅹ,10】 Ⅺ,11 】Ⅻ,12】 XIII,13】 XIV,14】 XV,15 】XVI,16 】XVII,17 】XVIII,18】
<span style="white-space:pre"> </span> * XIX,19】 XX,20】 XXI,21 】XXII,22 】XXIX,29】 XXX,30】 XXXIV,34】 XXXV,35 】
<span style="white-space:pre"> </span> * XXXIX,39】 XL,40】 L,50 】LI,51】 LV,55】 LX,60】 LXV,65】 LXXX,80】 XC,90 】
<span style="white-space:pre"> </span> * XCIII,93】 XCV,95 】XCVIII,98】 XCIX,99 】
<span style="white-space:pre"> </span> * 百位数举例
<span style="white-space:pre"> </span> * C,100】 CC,200 】CCC,300 】CD,400】 D,500 】DC,600 】DCC,700】 DCCC,800 】CM,900】
<span style="white-space:pre"> </span> * CMXCIX,999】
<span style="white-space:pre"> </span> * 千位数举例
<span style="white-space:pre"> </span> * M,1000】 MC,1100 】MCD,1400 】MD,1500 】MDC,1600 】MDCLXVI,1666】 MDCCCLXXXVIII,1888 】
<span style="white-space:pre"> </span> * MDCCCXCIX,1899 】MCM,1900 】MCMLXXVI,1976】 MCMLXXXIV,1984】
<span style="white-space:pre"> </span> * MCMXC,1990 】MM,2000 】MMMCMXCIX,3999】
<span style="white-space:pre"> </span> * 千位数以上举例
<span style="white-space:pre"> </span> * ,65,259 】,134945584】, 183650】
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>//444msA
<span style="white-space:pre"> </span>public static int romanToInt(String s) {
<span style="white-space:pre"> </span>s = s + " ";//防止(i+1)溢出
<span style="white-space:pre"> </span>int len = s.length();
<span style="white-space:pre"> </span>int re = 0;
<span style="white-space:pre"> </span>for (int i = 0; i < len; i++) {
<span style="white-space:pre"> </span>switch (s.charAt(i)) {
<span style="white-space:pre"> </span>case 'M':
<span style="white-space:pre"> </span>re = re + 1000;
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>case 'D':
<span style="white-space:pre"> </span>re = re + 500;
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>case 'C':
<span style="white-space:pre"> </span>if (s.charAt(i + 1) == 'M') {
<span style="white-space:pre"> </span>re = re + 900;
<span style="white-space:pre"> </span>i++;
<span style="white-space:pre"> </span>} else if (s.charAt(i + 1) == 'D') {
<span style="white-space:pre"> </span>re = re + 400;
<span style="white-space:pre"> </span>i++;
<span style="white-space:pre"> </span>} else {
<span style="white-space:pre"> </span>re = re + 100;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>case 'L':
<span style="white-space:pre"> </span>re = re + 50;
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>case 'V':
<span style="white-space:pre"> </span>re = re + 5;
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>case 'X':
<span style="white-space:pre"> </span>if (s.charAt(i + 1) == 'C') {
<span style="white-space:pre"> </span>re = re + 90;
<span style="white-space:pre"> </span>i++;
<span style="white-space:pre"> </span>} else if (s.charAt(i + 1) == 'L') {
<span style="white-space:pre"> </span>re = re + 40;
<span style="white-space:pre"> </span>i++;
<span style="white-space:pre"> </span>} else {
<span style="white-space:pre"> </span>re = re + 10;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>case 'I':
<span style="white-space:pre"> </span>if (s.charAt(i + 1) == 'X') {
<span style="white-space:pre"> </span>re = re + 9;
<span style="white-space:pre"> </span>i++;
<span style="white-space:pre"> </span>} else if (s.charAt(i + 1) == 'V') {
<span style="white-space:pre"> </span>re = re + 4;
<span style="white-space:pre"> </span>i++;
<span style="white-space:pre"> </span>} else {
<span style="white-space:pre"> </span>re = re + 1;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>default:
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return re;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>//528msA 但是此版本的C++代码只用64ms
<span style="white-space:pre"> </span>public static int romanToInt1(String s) {
<span style="white-space:pre"> </span>int result = 0;
<span style="white-space:pre"> </span>Map<Character, Integer> hashMap = new HashMap<Character, Integer>(7);
<span style="white-space:pre"> </span>hashMap.put('I', 1);
<span style="white-space:pre"> </span>hashMap.put('V', 5);
<span style="white-space:pre"> </span>hashMap.put('X', 10);
<span style="white-space:pre"> </span>hashMap.put('L', 50);
<span style="white-space:pre"> </span>hashMap.put('C', 100);
<span style="white-space:pre"> </span>hashMap.put('D', 500);
<span style="white-space:pre"> </span>hashMap.put('M', 1000);
<span style="white-space:pre"> </span>for (int i = s.length() - 1; i >= 0; i--)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>if (i == s.length() - 1)
<span style="white-space:pre"> </span>{//最后一个加一会溢出
<span style="white-space:pre"> </span>result = hashMap.get(s.charAt(i));
<span style="white-space:pre"> </span>continue;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if (hashMap.get(s.charAt(i)) >= hashMap.get(s.charAt(i + 1)))
<span style="white-space:pre"> </span>result += hashMap.get(s.charAt(i));
<span style="white-space:pre"> </span>else
<span style="white-space:pre"> </span>result -= hashMap.get(s.charAt(i));
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return result;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public static void main(String[] args) {
<span style="white-space:pre"> </span>String a = "MDCLXXXIX";//1689
<span style="white-space:pre"> </span>//a = "DCXXI";//1689
<span style="white-space:pre"> </span>System.out.println(a);
<span style="white-space:pre"> </span>System.out.println(romanToInt(a));
<span style="white-space:pre"> </span>System.out.println(romanToInt1(a));
<span style="white-space:pre"> </span>}
}