1. 程式人生 > >leetCode 12 Integer to Roman

leetCode 12 Integer to Roman

題目描述(中等難度)

把數字轉換成羅馬數字,正常情況就是把每個字母相加,並且大字母在前,小字母在後,上邊也介紹了像 4 和 9 那些特殊情況。

解法一

這個是自己的解法,主要思想就是每次取出一位,然後得到相應的羅馬數字,然後合起來就行。

public String getRoman(int num,int count){ //count 表示當前的位數,個位,十位...
    char[]ten={'I','X','C','M'}; //1,10,100,1000
    char[]five={'V','L','D'};//5,50,500
    String r="";
    if(num<=3){
        while
(num!=0){ r+=ten[count]; num--; } } if(num==4){ r=(ten[count]+"")+(five[count]+""); } if(num==5){ r=five[count]+""; } if(num>5&&num<9){ r=five[count]+""; num-=5; while(num!=0){ r+=
ten[count]; num--; } } if(num==9){ r = (ten[count] + "") + (ten[count + 1] + ""); } return r; } public String intToRoman(int num) { String r=""; int count=0; while(num!=0){ int pop=num%10; r=getRoman(pop,count)+r; count++; num/=
10; } return r; }

時間複雜度:num 的位數 log10(num)+1log_{10}(num)+1所以時間複雜度是 O(log(n))。

空間複雜度:常數個變數,O(1)。

下邊在分享一些 LeetCode 討論裡的一些解法。

解法二

public String intToRoman(int num) {
    int[] values = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
    String[] strs = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
    
    StringBuilder sb = new StringBuilder();
    
    for(int i=0;i<values.length;i++) {
        while(num >= values[i]) {
            num -= values[i];
            sb.append(strs[i]);
        }
    }
    return sb.toString();
}

相當簡潔了,主要就是把所有的組合列出來,因為羅馬數字表示的大小就是把所有字母相加,所以每次 append 那個,再把對應的值減去就行了。

時間複雜度:不是很清楚,也許是 O(1)?因為似乎和問題規模沒什麼關係了。

空間複雜度:O(1).

解法三

public String intToRoman(int num) {
    String M[] = {"", "M", "MM", "MMM"};//0,1000,2000,3000
    String C[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};//0,100,200,300...
    String X[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};//0,10,20,30...
    String I[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};//0,1,2,3...
    return M[num/1000] + C[(num%1000)/100]+ X[(num%100)/10] + I[num%10];
}

這就更加暴力了,把每位的情況都列出來然後直接返回,但思路清晰明瞭呀。

時間複雜度:O(1)或者說是 num 的位數,不是很確定。

空間複雜度:O(1)。

這道題感覺難度應該是 easy ,沒有那麼難,就是理清楚題意,然後就可以往出列舉就行了。