12. 整数转罗马数字
就是一个模拟,每次处理完的结果都要是比之前的值小,比如处理完1000后,必须比1000小。
但这个程序实际上带来了两个问题:
- 如果追求代码的可读性和可扩展性,就会导致空间和时间的损失
- 追求时间和空间,就是使得代码写得难看
下面给出两种写法:
- 代码可读性较强,扩展性较强,但速度慢
public String intToRoman(int num) {
TreeMap<Integer, String> MAP = preSolve();
StringBuilder builder = new StringBuilder();
for (Map.Entry<Integer, String> entry : MAP.entrySet()) {
if (num==0) break;
while (num >= entry.getKey()) {
builder.append(entry.getValue());
num -= entry.getKey();
}
}
return builder.toString();
}
public TreeMap<Integer, String> preSolve() {
TreeMap<Integer, String> Map = new TreeMap<>((o1, o2) -> o2 - o1);
String[] map = {"I", "IV", "V", "IX","X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"};
int[] ints = {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};
for (int i = 0; i < map.length; i++) {
Map.put(ints[i], map[i]);
}
return Map;
}
- 代码可读性差,但是速度快,空间小 ps:写这个代码让我感觉自己好像机器人......
public String intToRoman(int num) {
StringBuilder builder = new StringBuilder();
while (num != 0) {
if (num>=1000){
builder.append("M");
num-=1000;
}else if (num>=900){
builder.append("CM");
num-=900;
}else if (num>=500){
builder.append("D");
num-=500;
}else if (num>=400){
builder.append("CD");
num-=400;
}else if (num>=100){
builder.append("C");
num-=100;
}else if (num>=90){
builder.append("XC");
num-=90;
}else if (num>=50){
builder.append("L");
num-=50;
}else if (num>=40){
builder.append("XL");
num-=40;
}else if (num>=10){
builder.append("X");
num-=10;
}else if (num>=9){
builder.append("IX");
num-=9;
}else if (num>=5){
builder.append("V");
num-=5;
}else if (num>=4){
builder.append("IV");
num-=4;
}else{
builder.append("I");
num-=1;
}
}
return builder.toString();
}