leetcode-個人題解12

LEETCODE專題


12. Integer to Roman

題目要求:
這裏寫圖片描述


題目相信大家都看得懂,下面就來直接說一下筆者遇到的問題吧。

  • 問題
    • 如何將對應的位數轉爲羅馬數字。
    • 遇到4, 9的情況如何區分。

這裏來簡單科普一下羅馬數字的字符表示:

十進制數字 羅馬數字
1 I
4 IV
5 V
9 IX
10 X
40 XL
50 L
90 XC
100 C
400 CD
500 D
900 CM
1000 M

所以對於每個位數的數字,其羅馬數字字符都是不一樣的,其規則也是具有5和10的雙重判定
爲了解決這個問題,我們可以自行定義這些映射,再在轉羅馬數字的時候調用這個映射就可以了。
這樣第一個問題就迎刃而解了。

然而棘手的是第二個問題。
從表中我們可以看到當數字爲4或者9時起羅馬數字是有異同點的。相同的點就是位數一致時,他們的羅馬數字第一個字符都是一樣的,都是該位數的單位值。例如40和90的羅馬數字第一個字符就是表示10的”X”,10即該位數的單位值。不同的點是它們羅馬數字的第二個字符不一樣。但是,我們也可以看出規律,例如40的羅馬數字第二個字符就是表示50的”L”,而90的羅馬數字第二個字符就是表示100的”C”。這樣問題就簡單多了,我們可以判定數字爲4時,字符串爲該位數的單位值加上該位數表示5的羅馬數字字符;數字爲9時,字符串爲該位數的單位值加上該位數表示10的羅馬數字字符。


class Solution {
public:    
    string intToRoman(int num) {
        /* mod the num with 1000, 500 or so
         * and set the Roman char
         */
        int mod = 1000;
        char weight;

        // stroe the Roman string
        string Roman;

        while (num != 0 && mod != 0) {
            weight = getWeight(mod);
            if (modHalf(mod) == true) {
                // exception handler for 9
                if (num / (mod / 5) == 9) {
                    Roman += getWeight(mod / 5);
                    Roman += getWeight(mod * 2);
                    num %= mod / 5;
                    mod = getNextMod(getNextMod(mod));
                    continue;
                }
            } else {
                // exception handler for 4
                if (num / mod == 4) {
                    Roman += getWeight(mod);
                    Roman += getWeight(mod * 5);
                    num %= mod;
                    mod = getNextMod(mod);
                    continue;
                }
            }
            for (int i = 0; i < num / mod; i++) {
                Roman += getWeight(mod);
            }

            num %= mod;
            mod = getNextMod(mod);
        }

        return Roman;
    }

    bool modHalf(int mod) {
        return mod == 5 || mod == 50 || mod == 500;
    }

    int getNextMod(int mod) {
        switch(mod) {
            case 1000:
                return 500;
            case 500:
                return 100;
            case 100:
                return 50;
            case 50:
                return 10;
            case 10:
                return 5;
            case 5:
                return 1;
            default:
                return 0;
        }
    }

    char getWeight(int mod) {
        switch(mod) {
            case 1000:
                return 'M';
            case 500:
                return 'D';
            case 100:
                return 'C';
            case 50:
                return 'L';
            case 10:
                return 'X';
            case 5:
                return 'V';
            case 1:
            default:
                return 'I';
        }
    }
};

時間複雜度:O(n)

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