Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
意思是把罗马数字转成数字,那我们首先就要了解罗马数字是怎么组成的。
基本字符 |
I
|
V
|
X
|
L
|
C
|
D
|
M
|
---|---|---|---|---|---|---|---|
相应的阿拉伯数字表示为 |
1
|
5
|
10
|
50
|
100
|
500
|
1000
|
(2) 小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=12;
(3) 小的数字(限于 I、X 和 C)在大的数字的左边、所表示的数等于大数减小数得到的数、如:Ⅳ=4、Ⅸ=9;
(4) 正常使用时、连写的数字重复不得超过三次;
个位数举例
Ⅰ-1、Ⅱ-2、Ⅲ-3、Ⅳ-4、Ⅴ-5、Ⅵ-6、Ⅶ-7、Ⅷ-8、Ⅸ-9
·十位数举例
Ⅹ-10、Ⅺ-11、Ⅻ-12、XIII-13、XIV-14、XV-15、XVI-16、XVII-17、XVIII-18、XIX-19、XX-20、XXI-21、XXII-22、XXIX-29、XXX-30、XXXIV-34、XXXV-35、XXXIX-39、XL-40、L-50、LI-51、LV-55、LX-60、LXV-65、LXXX-80、XC-90、XCIII-93、XCV-95、XCVIII-98、XCIX-99
·百位数举例
C-100、CC-200、CCC-300、CD-400、D-500、DC-600、DCC-700、DCCC-800、CM-900、CMXCIX-999
·千位数举例
M-1000、MC-1100、MCD-1400、MD-1500、MDC-1600、MDCLXVI-1666、MDCCCLXXXVIII-1888、MDCCCXCIX-1899、MCM-1900、MCMLXXVI-1976、MCMLXXXIV-1984、MCMXC-1990、MM-2000、MMMCMXCIX-3999
还算是比较简单的,找到规律就好了。当遍历到一个字母,如果它后一个字母代表的数字比它大的话,说明两者要相减。否则的话直接加上当前这个数字。package leetcode;
import java.util.HashMap;
public class Roman_to_Integer_13 {
public int romanToInt(String s) {
int result=0;
HashMap<Character,Integer> map=new HashMap<Character, Integer>();
map.put('I', 1);
map.put('V', 5);
map.put('X', 10);
map.put('L', 50);
map.put('C', 100);
map.put('D', 500);
map.put('M', 1000);
char[] chars=s.toCharArray();
int i=0;
for(i=0;i<chars.length-1;i++){
char c=chars[i];
char next=chars[i+1];
int thisInt=map.get(c);
int nextInt=map.get(next);
if(nextInt>thisInt){
result+=(nextInt-thisInt);
i++;
}
else{
result+=thisInt;
}
}
if(i==chars.length-1){
result+=map.get(chars[i]);
}
return result;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Roman_to_Integer_13 r=new Roman_to_Integer_13();
System.out.println(r.romanToInt("MCMLXXXIV"));
}
}
大神想法也跟我类似,解法easy to understand.
public int romanToInt(String s) {
int nums[]=new int[s.length()];
for(int i=0;i<s.length();i++){
switch (s.charAt(i)){
case 'M':
nums[i]=1000;
break;
case 'D':
nums[i]=500;
break;
case 'C':
nums[i]=100;
break;
case 'L':
nums[i]=50;
break;
case 'X' :
nums[i]=10;
break;
case 'V':
nums[i]=5;
break;
case 'I':
nums[i]=1;
break;
}
}
int sum=0;
for(int i=0;i<nums.length-1;i++){
if(nums[i]<nums[i+1])
sum-=nums[i];
else
sum+=nums[i];
}
return sum+nums[nums.length-1];
}