题目链接: 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 beforeV
(5) andX
(10) to make 4 and 9.X
can be placed beforeL
(50) andC
(100) to make 40 and 90.C
can be placed beforeD
(500) andM
(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语句。
另外顺便推荐大家多看看编程规范,养成好习惯。
原文链接:https://blog.csdn.net/w605283073/article/details/80010307
本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。
还没有人抢沙发呢~