LeetCode - 13. Roman to Integer

链接

13. Roman to Integer

题意

根据罗马数字表示法给出阿拉伯数字表示法。

思路

按每一位的值相加即可,但若左边符号比右边符号小,是需要用较大值减较小值的。具体组数规则百度。

代码

Java:

public class Solution {
    public int romanToInt(String s) {
        char[] k = {'I', 'V', 'X', 'L', 'C', 'D', 'M'};
        int[] v = {1, 5, 10, 50, 100, 500, 1000};
        Map<Character, Integer> map = new HashMap();
        for (int i = 0; i < k.length; i++) {
            map.put(k[i], v[i]);
        }
        int res = 0;
        for (int i = 0; i < s.length(); i++) {
            if (i + 1 < s.length() && map.get(s.charAt(i)) < map.get(s.charAt(i + 1))) {
                res += map.get(s.charAt(i + 1)) - map.get(s.charAt(i));
                i++;
            } else {
                res += map.get(s.charAt(i));
            }
        }
        return res;
    }
}

// 较快的方法
public class Solution {
    public int romanToInt(String s) {
        int graph[] = new int[400];
        graph['I'] = 1;
        graph['V']=5;
        graph['X']=10;
        graph['L']=50;
        graph['C']=100;
        graph['D']=500;
        graph['M']=1000;
        char[] num = s.toCharArray();
        // 遍历这个数,用sum来总计和
        int sum = graph[num[0]];
        for(int i=0; i<num.length-1; i++){
            // 如果,i比i+1大的话,直接相加
            if(graph[num[i]] >= graph[num[i+1]]){
                sum += graph[num[i+1]];
            }
            // 如果i比i+1小的话,则将总和sum减去i这个地方数的两倍,同时加上i+1
            // 就相当于后边的数比左边的数大,则用右边的数减左边的数
            else{
                sum = sum + graph[num[i+1]] - 2*graph[num[i]];
            }
        }
        return sum;
    }
        
}
posted @ 2017-05-16 11:24  zyoung  阅读(175)  评论(0编辑  收藏  举报