请看下倍儿长的题目。u man:
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
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 不写做 IIII,而是 IV。
数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。
同样地,数字 9 表示为 IX。
这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
示例 1:
输入: "III"
输出: 3
**示例 2:**
输入: "IV"
输出: 4
示例 3:
输入: "IX"
输出: 9
示例 4:
输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:
输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
这是给的函数名
class Solution {
public int romanToInt(String s) {
}
}
OOK!这个时候大家是不是晕掉了?
什么玩意嘛
不过不要着急,这一题的解题思路还是很清晰的。他给我们一个字符串
我们对这个字符串里面的字母进行数字转换,
虽然转换的规则很绕,但是我们抽象一下题目的这部分哈:
罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。
27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。
但也存在特例,例如 4 不写做 IIII,而是 IV。
数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。
同样地,数字 9 表示为 IX。
这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
无论怎么绕都是,若是一个代表较大数字的字母,排在前面(即左边),他和后面的是相加的关系。
若是一个代表较小数字的字母排在前面,就会被后一个大数字减去前方较小的数字。
最多的反向关系,也就是一对两个字母。
好的;到这里转换规则理解了吧?
嗯继续,我们需要选择我们算法所需要的数据结构了。
首先对于每个字母有其对应的值,我们想到了Map,而由map我们顺而想到hashmap
不会hashmap类的参考Java集合中的HashMap
我们也要将传进来的String给转换成char数组,幸运的是Java中字符串自带转换函数,perfect!!!
OK
我们将char数组和HashMap中进行一一比对,并将数值传到int数组中,这样方便我们后续比较。
最后我们对得到的int数组进行操作,得到结果。
代码如下
class Solution {
Map<Character,Integer> Roma=new HashMap<>();
public int romanToInt(String s) {
Roma.put('I',1);
Roma.put('V', 5);
Roma.put('X', 10);
Roma.put('L',50);
Roma.put('C', 100);
Roma.put('D', 500);
Roma.put('M', 1000);
int num=0;
char[] c=s.toCharArray();
int[] temp=new int[c.length];
for(int i=0;i<c.length;i++){
temp[i]=Roma.get(c[i]); //初始化String对应的int数组
}
for(int i=0;i<temp.length;i++){
if(i==temp.length-1){
num=num+temp[i];//以防数组越界,特别需要注意
}
else if(temp[i]>=temp[i+1]){
num=num+temp[i];//正常情况累加即可
}
else
{
i++;//异常情况,先将i++以防i=0时出现数组越界;右边大数减去左边小数
num=num+temp[i]-temp[i-1];
}
}
return num;
}
}
最后宣传下我个人的微信公众号,微信搜索:可及的小屋,有志向整副业,娱乐的程序员们,欢迎您的到来。谢谢。
100G程序员资料,自取哦!!