罗马数字转整数
力扣题号13 是一道比较简单的算法题,主要是对罗马数字的转换
题目描述
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 | 罗马数字包含以下七种字符: 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:
 
 输入: s = "III"
 输出: 3
 
 | 
算法题主要是总结规律,我们不难发现
- 罗马数字,当小值在做左侧时,则减小值,比如: IV = 5 -1 =4
- 当小值在右侧时则增大值,比如:VI = 5 + 1 = 6
知道这个规律就可以轻松的解决这道题了,一个for循环遍历就完事了
 查看代码 
              
              | 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 | class Solution {Map<Character, Integer> map = new HashMap<Character, Integer>(){
 {
 put('I',1);
 put('V',5);
 put('X',10);
 put('L',50);
 put('C',100);
 put('D',500);
 put('M',1000);
 }
 };
 public int romanToInt(String s) {
 int sum = 0 ;
 for (int i = 0; i < s.length(); i++) {
 if (i < s.length() -1 && map.get(s.charAt(i)) < map.get(s.charAt(i + 1))){
 sum -= map.get(s.charAt(i));
 }else {
 sum += map.get(s.charAt(i));
 }
 }
 return sum;
 
 | 
 
            如果不满足这个代码的执行效率,当然也可以优化一下
 代码优化 
              
              | 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 
 | class Solution {public int romanToInt(String s) {
 int sum = 0;
 int preNum = getValue(s.charAt(0));
 for(int i = 1;i < s.length(); i ++) {
 int num = getValue(s.charAt(i));
 if(preNum < num) {
 sum -= preNum;
 } else {
 sum += preNum;
 }
 preNum = num;
 }
 sum += preNum;
 return sum;
 }
 
 private int getValue(char ch) {
 switch(ch) {
 case 'I': return 1;
 case 'V': return 5;
 case 'X': return 10;
 case 'L': return 50;
 case 'C': return 100;
 case 'D': return 500;
 case 'M': return 1000;
 default: return 0;
 }
 }
 }
 
 |