罗马数字由七个不同的符号表示:I
,V
,X
,L
,L
,C
,D
和M
。
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如,2在罗马数字中写为II,只有两个加在一起。 12写为XII,仅是X + II。数字27写为xxvii,即xx + v + ii。
罗马数字通常是从左到右写的。但是,四个数字不是IIII。相反,第四数字写为IV。因为一个是在五个之前,我们减去了四个。相同的原理适用于第九个数字,该数字写为IX。在六个实例中使用减法:
- 我可以在V(5)和x(10)之前放置4和9。
- x可以放置在l(50)和c(100)之前,以使40和90。
- C可以在D(500)和M(1000)之前放置400和900。 给定罗马数字,将其转换为整数。
示例1:
输入:s = "III"
输出:3
说明:III = 3.
示例2:
输入:s = "LVIII"
输出:58
说明:L = 50, V= 5, III = 3.
示例3:
输入:s = "MCMXCIV"
输出:1994
说明:M = 1000, CM = 900, XC = 90 and IV = 4.
约束:
1 <= s.length <= 15
s contains only the characters ('I', 'V', 'X', 'L', 'C', 'D', 'M').
It is guaranteed that s is a valid roman numeral in the range [1, 3999].
方法:
-
创建一个散布:首先,创建一个命名table的命名为将罗马数字字符映射到其相应的整数值。该映射对于将输入字符串中的每个字符转换为其数值等效的每个字符至关重要。
-
初始化变量:初始化了两个整数变量:
-
sum:此变量将存储罗马数字字符串的累积整数值。
-
prevvalue:此变量在通过字符串迭代时跟踪先前的罗马数字值。反向通过字符串列表:该代码使用for loop通过输入字符串迭代s以相反的顺序从最后一个字符开始,然后向第一个字符移动。这种相反的迭代对于处理较小数字之前的案例至关重要(例如,对于900的数字4或“ IV”或“ CM”)。
-
检索当前字符的值:在循环内,代码在使用Hashtable table.get(ch)中检索当前罗马数字字符(CH)的整数值。
-
检查是否在数字前面的较小之前:代码检查当前数字的值(数据)是否小于先前的数字值(PrevValue)。此检查用于确定是否需要减法,因为使用加法和减法规则构建了罗马数字。
-
更新总和变量:根据比较结果,代码要么从总和中减去当前数字的值(数据),要么将其添加到总和中。此步骤累积了罗马数字字符串的整个整数。
-
更新prevvalue:处理当前字符后,PrevValue变量将使用当前数字的值进行更新。
-
返回结果:处理输入字符串中的所有字符后,最终整数值(sum)将作为转换的结果返回。
代码:
import java.util.Hashtable;
class Solution {
public int romanToInt(String s) {
Hashtable<Character, Integer> Tabl = new Hashtable<>();
Tabl.put('I', 1);
Tabl.put('V', 5);
Tabl.put('X', 10);
Tabl.put('L', 50);
Tabl.put('C', 100);
Tabl.put('D', 500);
Tabl.put('M', 1000);
int sum = 0;
int prevValue = 0;
for (int i = s.length() - 1; i >= 0; i--) {
char ch = s.charAt(i);
int data = Tabl.get(ch);
if (data < prevValue) {
sum -= data;
} else {
sum += data;
}
prevValue = data;
}
return sum;
}
}
解释:
该代码使用Hashtable有效地将罗马数字字符映射到其整数值。它利用反向迭代来处理减法案例并将结果累积在总和变量中。通过将当前数字值与上一个比较,它确定是添加还是减值值,确保从罗马数字到整数的准确转换。
这种方法既简洁又有效地解决了将罗马数字转换为整数的问题,并且遵守罗马数字表示的规则和惯例。