题目链接: https://leetcode.com/problems/roman-to-integer/description/
题目描述:
Roman numerals are represented by seven different symbols: I
, V
, X
, L
, C
, D
and M
.
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
For example, two is written as II
in Roman numeral, just two one's added together. Twelve is written as, XII
, which is simply X
+ II
. The number twenty seven is written as XXVII
, which is XX
+ V
+ II
.
Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII
. Instead, the number four is written as IV
. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX
. There are six instances where subtraction is used:
I
can be placed before V
(5) and X
(10) to make 4 and 9. X
can be placed before L
(50) and C
(100) to make 40 and 90. C
can be placed before D
(500) and M
(1000) to make 400 and 900.Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.
Example 1:
Input: "III"
Output: 3
Example 2:
Input: "IV"
Output: 4
Example 3:
Input: "IX"
Output: 9
Example 4:
Input: "LVIII"
Output: 58
Explanation: C = 100, L = 50, XXX = 30 and III = 3.
Example 5:
Input: "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
题目提示:
提示1:
I - 1
V - 5
X - 10
L - 50
C - 100
D - 500
M - 1000
提示2:
Rules:
* If I comes before V or X, subtract 1 eg: IV = 4 and IX = 9
* If X comes before L or C, subtract 10 eg: XL = 40 and XC = 90
* If C comes before D or M, subtract 100 eg: CD = 400 and CM = 900
我们可以观察出规律并得出算法思路:
代码:
/**
* 罗马数字转数字
*
* @param s 罗马数字字符串
* @return 数字
*/
public int romanToInt(String s) {
//存放每个罗马字母对应的数值
int[] numbers = new int[s.length()];
for (int i = 0; i < s.length(); i++) {
switch (s.charAt(i)) {
case 'M':
numbers[i] = 1000;
break;
case 'D':
numbers[i] = 500;
break;
case 'C':
numbers[i] = 100;
break;
case 'L':
numbers[i] = 50;
break;
case 'X':
numbers[i] = 10;
break;
case 'V':
numbers[i] = 5;
break;
case 'I':
numbers[i] = 1;
break;
default:
}
}
int sum = 0;
for (int i = 0; i < numbers.length - 1; i++) {
if (numbers[i] < numbers[i + 1]) {
sum -= numbers[i];
} else {
sum += numbers[i];
}
}
return sum + numbers[numbers.length - 1];
}
需要特别注意的是根据《阿里巴巴Java编程规范》 1.7控制语句 这一节的 第一条所示:
上面的switch块内,需要加上一个default语句。
另外顺便推荐大家多看看编程规范,养成好习惯。