LeetCode - 13. Roman to Integer

題目:

Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.


思路與步驟:

分兩步進行,先對應,再計算。基本思路是:

    首先將 roman 基本字符與阿拉伯數字對應起來,存在一個結構中,然後對輸入的字符串逐個字符判斷,對應。最後得出最終的阿拉伯數字。

    由於存放 roman-int 的對應結構的選擇不同,主要有下面兩種不同的思路(每種思路可以有不同的實現方法):

1. 用switch-case語句

  1.1 兩個函數

    第一個函數 baseChar() 先取得對應關係,後面直接操作 int 型的 baseChar 即可。

  1.2 一個函數

    比上面多用一個數組。先將字符串 s 中每個字符對應的數字存入 int 數組 nums[ ] 中,後面計算時直接對 nums[] 進行操作即可。

2. 用hashmap

    將 roman 與 int 存入hashmap中。


編程實現:

1. 用switch-case語句

1.1 兩個函數

public class Solution {
    // method-1: switch-case and two functions
    public int baseChar(char c){
        int baseInt = 0;
        switch(c){
            case 'I': baseInt = 1; break;
            case 'V': baseInt = 5; break;
            case 'X': baseInt = 10; break;
            case 'L': baseInt = 50; break;
            case 'C': baseInt = 100; break;
            case 'D': baseInt = 500; break;
            case 'M': baseInt = 1000; break;
            default: baseInt = 0;
        }
        return baseInt;
        /* //比上面設置一個baseInt慢
        switch(c){
            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;
        }*/
    }
    public int romanToInt(String s) {
        int result = 0;
        char[] romanChar = s.toCharArray();
        int slen = s.length();
        for(int i=1; i<slen; i++){
            if( baseChar(romanChar[i-1]) < baseChar(romanChar[i]) ) result = result - baseChar(romanChar[i-1]);
            else    result = result + baseChar(romanChar[i-1]);
        }
        result = result + baseChar(romanChar[slen-1]);
        return result;
    }
}

1.2 一個函數

public class Solution {
    // method-2: switch-case and one function with array, 比method-1慢
    public int romanToInt(String s) {
        int result = 0;
        int slen = s.length();
        int[] num = new int[slen];
        char[] romanChar = s.toCharArray();
        for(int i=0; i<slen; i++){
            switch(romanChar[i]){
                case 'I': num[i] = 1; break;
                case 'V': num[i] = 5; break;
                case 'X': num[i] = 10; break;
                case 'L': num[i] = 50; break;
                case 'C': num[i] = 100; break;
                case 'D': num[i] = 500; break;
                case 'M': num[i] = 1000; break;
                default: num[i] = 0;
            }
        }
        for(int i=1; i<slen; i++){
            if(num[i-1] < num[i])   result = result - num[i-1];
            else    result = result + num[i-1];
        }
        result = result + num[slen-1];
        return result;
    }
}

1.1 比 1.2 快。


2. 用hashmap

public class Solution {
    // method-3: using hashmap
    public int romanToInt(String s) {
        Map<Character, Integer> numsMap = new HashMap<>();
        numsMap.put('I', 1);
        numsMap.put('V', 5);
        numsMap.put('X', 10);
        numsMap.put('L', 50);
        numsMap.put('C', 100);
        numsMap.put('D', 500);
        numsMap.put('M', 1000);
        
        int result = 0;
        int slen = s.length();
        char[] romanChar = s.toCharArray();
        for(int i=1; i<slen; i++){
            if(numsMap.get(romanChar[i-1]) < numsMap.get(romanChar[i]))
                result = result - numsMap.get(romanChar[i-1]);
            else    result = result + numsMap.get(romanChar[i-1]);
        }
        result = result + numsMap.get(romanChar[slen-1]);
        return result;
    }
}

用switch-case語句比hashmap快。

上述方法中,method-1 最快。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章