LeetCode Roman to Integer 罗马字符转数字 解题报告

时间:2022-11-28 09:49:53
https://oj.leetcode.com/problems/roman-to-integer/

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

把一个给定的罗马字符转为数字。首先要了解罗马字符表示的规则。
一,羅馬數字共有7個,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。
二,在較大的羅馬數字的右邊記上較小的羅馬數字,表示大數字加小數字,例如:VI(6),VIII(8),LV(55=50 + 5),LX(60=50 + 10)
三,在較大的羅馬數字的左邊記上較小的羅馬數字,表示大數字减小數字,例如:IX(9),XL(40=50 - 10),XC(90=100 - 10)
四,左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV。
五,左減時不可跨越一個位數。比如,99不可以用IC(100 - 1)表示,而是用XCIX([100 - 10] + [10 - 1])表示。

解题思路,有二条处理逻辑:
一,判断当前字符是否比next字符小,如果小的话需要用下一个字符减去当前字符加到最终结果字符身上。
二,否则的话,就把当前字符直接加到最终结果字符。

下面是AC代码:

public class Solution {
HashMap<Character, Integer> romanToIntMap = new HashMap<Character, Integer>() {
		{
			put('I', new Integer(1));
			put('V', new Integer(5));
			put('X', new Integer(10));
			put('L', new Integer(50));
			put('C', new Integer(100));
			put('D', new Integer(500));
			put('M', new Integer(1000));
		}
	};

	public int romanToInt(String s) {
		int ret = 0;
		int i = 0;
		while(i<s.length()) {
			if(s.charAt(i)=='I'||s.charAt(i)=='X'||s.charAt(i)=='C') {
				if((i+1)<=(s.length()-1)&&romanToIntMap.get(s.charAt(i))<romanToIntMap.get(s.charAt(i+1))) {
					ret += romanToIntMap.get(s.charAt(i+1)) - romanToIntMap.get(s.charAt(i));
					i = i + 2;
					continue;
				}
			} 
			ret += romanToIntMap.get(s.charAt(i));
			i++;
		}
		return ret;
	}
}