力扣13题罗马数字转换

请看下倍儿长的题目。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 ,即为两个并列的 112 写做 XII ,即为 X + II 。 
27 写做  XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。
但也存在特例,例如 4 不写做 IIII,而是 IV。
数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。
同样地,数字 9 表示为 IX。
这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 49。
X 可以放在 L (50) 和 C (100) 的左边,来表示 4090。 
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400900。
给定一个罗马数字,将其转换成整数。输入确保在 13999 的范围内。
示例 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 ,即为两个并列的 112 写做 XII ,即为 X + II 。 
27 写做  XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。
但也存在特例,例如 4 不写做 IIII,而是 IV。
数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。
同样地,数字 9 表示为 IX。
这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 49。
X 可以放在 L (50) 和 C (100) 的左边,来表示 4090。 
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400900

无论怎么绕都是,若是一个代表较大数字的字母,排在前面(即左边),他和后面的是相加的关系。
若是一个代表较小数字的字母排在前面,就会被后一个大数字减去前方较小的数字。
最多的反向关系,也就是一对两个字母。
好的;到这里转换规则理解了吧?
嗯继续,我们需要选择我们算法所需要的数据结构了。
首先对于每个字母有其对应的值,我们想到了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程序员资料,自取哦!!
可及的小屋

发布了8 篇原创文章 · 获赞 0 · 访问量 518

猜你喜欢

转载自blog.csdn.net/jjy19971023/article/details/103964313