自己想的
之所以用LinkedHashMap是为了遍历时不乱序
java
Map<Integer, String> map = new LinkedHashMap<>(){{
put(1, "I");
put(4, "IV");
put(5, "V");
put(9, "IX");
put(10, "X");
put(40, "XL");
put(50, "L");
put(90, "XC");
put(100, "C");
put(400, "CD");
put(500, "D");
put(900, "CM");
put(1000, "M");
}};
public String intToRoman1(int num) {
StringBuilder roman = new StringBuilder(); // 虽然线程不安全,但是快呀
int original = num;
while (original > 0) {
int max = findMax(original);
roman.append(map.get(max));
original = original - max;
}
return roman.toString();
}
int findMax1(int num) {
int res = 0;
for (Map.Entry<Integer, String> entry : map.entrySet()) {
if (entry.getKey() > num) {
break; // 直接退出循环
}else{
res = entry.getKey();
}
}
return res;
}
很慢
使用数组代替map
java
int[] values = {1,4,5,9,10,40,50,90,100,400,500,900,1000};
String[] symbols = {
"I", "IV", "V", "IX",
"X", "XL", "L", "XC",
"C", "CD", "D", "CM", "M"
};
// 59
public String intToRoman2(int num) {
StringBuilder roman = new StringBuilder(); // 虽然线程不安全,但是快呀
while (num > 0) {
int index = findMax2(num);
roman.append(symbols[index]);
num = num - values[index];
}
return roman.toString();
}
int findMax2(int num) {
int res = 0;
for (int i = 0; i < values.length; i++) {
if (num < values[i]) {
break;
}else {
res = i;
}
}
return res;
}

官解
感觉法二是差不多思路,只不过内外循环颠倒了下。
java
int[] values3 = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
String[] symbols3 = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
public String intToRoman3(int num) {
StringBuilder roman = new StringBuilder(); // 虽然线程不安全,但是快呀
for(int i=0 ; i<symbols3.length ; i++) {
int value = values3[i];
String symbol = symbols3[i];
while (num >= value) {
roman.append(symbol);
num -= value;
}
if(num == 0){
break;
}
}
return roman.toString();
}
