No.013:Roman to Integer
问题:
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
官方难度:
Easy
翻译:
将一个范围在1-3999的罗马字符,转化成整数形式。
- 罗马字符的规则见上一章No.012。
- 输入不考虑非罗马字符,或错误的罗马字符形式,如“IVI”。
- 需要一个翻译,罗马字符-数字的映射关系的字典方法。
- 依次根据罗马字符累加,但是要考虑4和9的特殊情况。具体的做法是,维护一个previous的int型变量,记录上一个罗马字符代表的整数值,若发现当前数字是previous的5倍或10倍,将previous*2减回去。
解题代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // 不考虑非法的罗马字符串形式 2 public static int romanToInt(String roman) { 3 if (roman == null) { 4 throw new IllegalArgumentException("Input error"); 5 } 6 char[] array = roman.toCharArray(); 7 int sum = 0; 8 // 上一个字符串代表的值,赋初始值不要影响第一次计算 9 int previous = -1; 10 int current; 11 for (int i = 0; i < array.length; i++) { 12 current = romanDict(array[i]); 13 // 特殊的4、9处理 14 if (current / previous == 5 || current / previous == 10) { 15 sum -= 2 * previous; 16 } 17 sum += current; 18 previous = current; 19 } 20 return sum; 21 } 22 23 // 罗马数字转化字典 24 private static int romanDict(char str) { 25 switch (str) { 26 case 'I': 27 return 1; 28 case 'V': 29 return 5; 30 case 'X': 31 return 10; 32 case 'L': 33 return 50; 34 case 'C': 35 return 100; 36 case 'D': 37 return 500; 38 case 'M': 39 return 1000; 40 default: 41 return 0; 42 } 43 }
相关链接:
https://leetcode.com/problems/roman-to-integer/
PS:如有不正确或提高效率的方法,欢迎留言,谢谢!