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();
}