题目链接:13. 罗马数字转整数 - 力扣(LeetCode)
一 题目背景
做出来这道题目主要是了解罗马数字的构成以及罗马数字转化成10进制数字怎么转换
1.1罗马数字的构成:罗马数字由 7 个基本字符组:
I(1), V(5), X(10), L(50), C(100), D(500), M(1000)。
1.2 他们的组合也有一些小规律
(1)一般情况:
大数字在左边,小数字在右边,数值为各数字之和,下面举例说明
VI = 5+1 = 6; XI = 10 + 1 = 11;
(2)特殊情况:
小数字在大数字左边的时候,表示用大数字减去小数字,下面举例说明:
IV = 5 - 1 = 4; IX = 10 - 1 = 9; XL = 50 - 10 = 40;等等......
二写程序
知道他们的构成以及计算方式,就可以直接写程序了,核心思想是利用一个倒序遍历字符串s,如果大于,就将数字加上去,更新一下右边的最大值,反之直接减去较小的数字即可
java
class Solution {
public int romanToInt(String s) {
//创建一个哈希表将数据存入
Map<Character,Integer> map = new HashMap<>();
map.put('M', 1000);
map.put('D', 500);
map.put('C', 100);
map.put('L', 50);
map.put('X', 10);
map.put('V', 5);
map.put('I', 1);
//定义一个返回值
int ans = 0;
//定义一个值,代表右边的最大数字
int cur = 1;
//倒序遍历字符串s
for(int i=s.length()-1;i>=0;i--){
int val = map.get(s.charAt(i));
//情况一:遍历该处的数字大于cur,直接加,加完,将右边最大值更新
//情况二:遍历该处的数字小于cur,直接减
if(val>=cur){
ans+=val;
cur = val;
}else{
ans-=val;
}
}
return ans;
}
}