1. 程式人生 > >leetcode-個人題解12

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)