1. 程式人生 > >乘風破浪:LeetCode真題_013_Roman to Integer

乘風破浪:LeetCode真題_013_Roman to Integer

工程技術 shm 直接 string 代碼 相減 因此 輸入 hash

乘風破浪:LeetCode真題_013_Roman to Integer

一、前言

上一節我們討論了如何把阿拉伯數字轉換成羅馬數字,現在我們需要思考一下如何把羅馬數字轉換成阿拉伯數字,其實我們仔細觀擦這些結構就會發現羅馬數字如果前面的比後面的小,就需要用後面的減去前面的。而且如果有這樣的運算,也只是兩個字符拼接而成的,這為我們解題提供了思路。

二、Roman to Integer

2.1 問題

技術分享圖片

技術分享圖片

技術分享圖片技術分享圖片

2.2 分析與解決

根據題意,我們可以明白只需要從開始到結尾遍歷這些羅馬數字,如果發現前一個小於後一個代表的數字,則用後面的數值減去前面的數值,然後將這些數值相加在一起,這樣就能得到最終的結果了。同樣的我們也可以從後往前遍歷,如果發現前面的小於後面的就進行減法操作,否則直接相加也是可以的。當然這一切都要依靠於給定的羅馬數字是正確的前提下。

於是有了兩種方式:從前往後,從後往前。

從前往後:

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

技術分享圖片

  從後往前:

public class Solution {
    /**
     * 題目大意
     * 給定一個羅馬數字,將其轉換成對應的整數。
     * 輸入的數字在1-3999之間。
     *
     * 解題思路
     * 根據羅馬數字與整數數字對應關系進行加法操作,從後向前遍歷,如果前一個數字比後一個大就相減,否則進行相加。
     */
    public int romanToInt(String s) {

        int result = 0;
        int prev = 0; // 記錄前一個數字的值

        for (int i = s.length() - 1; i >= 0; i--) {
            switch (s.charAt(i)) {
                case ‘I‘: // 1
                    if (1 < prev) {
                        result -= 1;
                    } else {
                        result += 1;

                    }
                    prev = 1;
                    break;

                case ‘V‘: // 5

                    if (5 < prev) {
                        result -= 5;
                    } else {
                        result += 5;
                    }

                    prev = 5;

                    break;
                case ‘X‘: // 10
                    if (10 < prev) {
                        result -= 10;
                    } else {
                        result += 10;
                    }

                    prev = 10;
                    break;
                case ‘L‘: // 50
                    if (50 < prev) {
                        result -= 50;
                    } else {
                        result += 50;
                    }

                    prev = 50;
                    break;
                case ‘C‘: // 100
                    if (100 < prev) {
                        result -= 100;
                    } else {
                        result += 100;
                    }

                    prev = 100;
                    break;
                case ‘D‘: // 500
                    if (500 < prev) {
                        result -= 500;
                    } else {
                        result += 500;
                    }

                    prev = 500;
                    break;
                case ‘M‘: // 1000
                    result += 1000;
                    prev = 1000;
                    break;
            }
        }

        return result;
    }
}

技術分享圖片

三、總結

同樣的思路,有的代碼寫得非常具有條理性,有的寫得比較復雜,運行之後的耗時也是不同的,因此需要軟件工程技術上的培養。

乘風破浪:LeetCode真題_013_Roman to Integer