13. Roman to Integer
题目
罗马数字由7个符号表示: I, V, X, L, C, D 和M。
相应的值是:
Symbol(加法) | Value |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
例如,
2在罗马数字中写作II,就是把两个1加在一起。
12写作XII,即X+II。
27写作XXVII,即 XX + V + II。
但是4就写作IV,V - I。
9也是写作IX,即X - I。
有6个例子使用减法:
Symbol (减法) | Value |
---|---|
IV | 4 |
IX | 9 |
XL | 40 |
XC | 90 |
CD | 400 |
CM | 900 |
给出一个罗马数字,将它转换成一个整数。输入确保在(1 - 3999)之间。
例1:
Input: “III”
Output: 3
例2:
Input: “IV”
Output: 4
例3:
Input: “IX”
Output: 9
例4:
Input: “LVIII”
Output: 58
解释: C = 100, L = 50, XXX = 30 and III = 3.
例5:
Input: “MCMXCIV”
Output: 1994
解释:M = 1000, CM = 900, XC = 90 and IV = 4.
代码块
class Solution {
public int romanToInt(String s) {
int num[] = new int[s.length()];
int sum = 0;
for(int i = 0; i < s.length(); i++){
switch(s.charAt(i)){
case 'I':
num[i] = 1;
break;
case 'V':
num[i] = 5;
break;
case 'X':
num[i] = 10;
break;
case 'L':
num[i] = 50;
break;
case 'C':
num[i] = 100;
break;
case 'D':
num[i] = 500;
break;
case 'M':
num[i] = 1000;
break;
}
}
for(int i = 0; i < num.length - 1 ; i++){
if(num[i] >= num[i+1]){
sum = sum + num[i];
}else{
sum = sum - num[i];
}
}
return sum + num[num.length - 1];//在循环中,最后一个数字没考虑,加在这里不会越界。
}
}
代码分析
这道题是easy的类型,要把罗马数字转换为Int型,首先要了解罗马数字的构成,然后才可以分析这道题。不单需要把相应的罗马数字转换成对应的数字,还要考虑4,9,这种特殊类型。所以:
1. 首先,建立一个与字符串s等长的数组;
2. 然后,将每一位字符与整数一一对应;
3. 最后处理数组;
- 如果是正常类型的,就将各位数字累加;
- 如果是特殊情况,即前面的数字比后一位小,就做减法;(4,9,40, 90…)
4. 最后处理边界。
- 因为for循环中没有考虑最后一位数字,即num[length - 1],不然num[i+1]会越界。所以要把它单独处理。