Integer to Rome

做過又不會了,其實也不是不會,是我覺得自己寫出來的答案很蠢,但其實是OK的

我是想說分別建立千、百、十、個位的羅馬數字陣列,然後直接取用

但一直覺得這樣很蠢

於是想到說可以從千位數開始,每次減 1000 ,減一次就輸出一次

換到百位,從 900 開始,可是我就想說 700 這種數字怎辦呢?難道要先判斷 500~900區間然後再輸出?

那不就跟建立四個陣列再取值一樣

後來參考以前的作法,原來是先建立一個特殊數字陣列以及對應的羅馬字元陣列,

特殊數字是 9, 5, 4, 1 這些

接著遍歷這特殊數字,每次看當前的 n 是不是大於現在遍歷的特殊數字,如果是就黏上結果,然後換下一個特殊數字

可以這麼做是因為 9, 5, 4, 1 這些最多也只會出現一次,8 開頭的也會是5, 1 組合出來,

所以這麼做就可以「聰明」的輸出羅馬數字

public String intToRoman(int n) {
    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 (n >= values[i]) {
            sb.append(strs[i]);
            n -= values[i];
        }
    }
    return sb.toString();
}

results matching ""

    No results matching ""