題目描述
解題思路
代碼中返回的類型是String類型,轉成的羅馬數字是一個一個累上去的。
如:1994,是由1000(M),900(CM),90(XC),4(IV),累上去的。
由於返回的類型是String類型,並且又是累上去的,就想到用StringBuilder的append()方法,到了最後用toString()方法來return即可。
接着,題目中給出了一些特殊的數字,這些數字分別爲:
1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1
將它們當作key,那麼,它們所對應的value即爲:
“M”, “CM”, “D”, “CD”, “C”, “XC”, “L”, “XL”, “X”, “IX”, “V”, “IV”, “I”
當然這裏不用HashMap去做,在這裏,分別用一個int型數組和一個String類型的數組來對key和value進行存放。
接下來對key數組進行遍歷,用num來除以當前的key值,如果相除所得到的商不爲0(在這裏,只能爲1或2或3,因爲數字不超過3999),則對這個商的值進行循環,每次遞減1。在該循環當中,將所對應的羅馬數值給append上去即可。例如:當該商的值爲2,並且此時數組key的值指向key[0],則所對應的羅馬數字爲MM;如果商的值爲3,則所對應的羅馬數字爲MMM。
還有一點就是,做過一次運算之後,num值也要改變。
詳細代碼
class Solution {
public String intToRoman(int num) {
int[] key = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
String[] value = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
StringBuilder sb = new StringBuilder();
for(int i = 0; i < key.length; i ++) {
int k = num / key[i];
if(k == 0)
continue;
for(int j = k; j > 0; j--)
sb.append(value[i]);
num -= (k * key[i]);
if(num == 0)
break;
}
return sb.toString();
}
}
這個代碼消耗內存太大了,說明這個方法並不是特別好,到時候去看看別人的解題方法。