七个不同的符号代表罗马数字,其值如下:
符号 | 值 |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:
- 如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
- 如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (V) 减 1 (I): IV ,9 是 10 (X) 减 1 (I):IX。仅使用以下减法形式:4 (IV),9 (IX),40 (XL),90 (XC),400 (CD) 和 900 (CM)。
- 只有 10 的次方(I, X, C, M)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V),50 (L) 或 500 (D)。如果需要将符号附加4次,请使用 减法形式。
给定一个整数,将其转换为罗马数字。
具体实现并不麻烦,注意 4、9、40、90、400、900 的表示即可。
完整代码
class Solution {
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 >= 800) {
builder.append("DCCC");
num -= 800;
} else if (num >= 700) {
builder.append("DCC");
num -= 700;
} else if (num >= 600) {
builder.append("DC");
num -= 600;
} else if (num >= 500) {
builder.append("D");
num -= 500;
} else if (num >= 400) {
builder.append("CD");
num -= 400;
} else if (num >= 300) {
builder.append("CCC");
num -= 300;
} else if (num >= 200) {
builder.append("CC");
num -= 200;
} else if (num >= 100) {
builder.append("C");
num -= 100;
} else if (num >= 90) {
builder.append("XC");
num -= 90;
} else if (num >= 80) {
builder.append("LXXX");
num -= 80;
} else if (num >= 70) {
builder.append("LXX");
num -= 70;
} else if (num >= 60) {
builder.append("LX");
num -= 60;
} else if (num >= 50) {
builder.append("L");
num -= 50;
} else if (num >= 40) {
builder.append("XL");
num -= 40;
} else if (num >= 30) {
builder.append("XXX");
num -= 30;
} else if (num >= 20) {
builder.append("XX");
num -= 20;
} else if (num >= 10) {
builder.append("X");
num -= 10;
} else if (num == 9) {
builder.append("IX");
num -= 9;
} else if (num == 8) {
builder.append("VIII");
num -= 8;
} else if (num == 7) {
builder.append("VII");
num -= 7;
} else if (num == 6) {
builder.append("VI");
num -= 6;
} else if (num == 5) {
builder.append("V");
num -= 5;
} else if (num == 4) {
builder.append("IV");
num -= 4;
} else if (num == 3) {
builder.append("III");
num -= 3;
} else if (num == 2) {
builder.append("II");
num -= 2;
} else if (num == 1) {
builder.append("I");
num -= 1;
}
}
return String.valueOf(builder);
}
}
以上代码每执行一次判断,重新进入循环,又要走一次判断,将会浪费时间,可以进行优化,让其顺序执行。
完整代码
class Solution {
public String intToRoman(int num) {
StringBuilder builder = new StringBuilder();
while (num >= 1000) {
builder.append('M');
num -= 1000;
}
if (num >= 900) {
builder.append("CM");
num -= 900;
}
if (num >= 500) {
builder.append("D");
num -= 500;
} else if (num >= 400) {
builder.append("CD");
num -= 400;
}
while (num >= 100) {
builder.append("C");
num -= 100;
}
if (num >= 90) {
builder.append("XC");
num -= 90;
}
if (num >= 50) {
builder.append("L");
num -= 50;
} else if (num >= 40) {
builder.append("XL");
num -= 40;
}
while (num >= 10) {
builder.append("X");
num -= 10;
}
if (num == 9) {
builder.append("IX");
num -= 10;
}
if (num >= 5) {
builder.append("V");
num -= 5;
} else if (num == 4) {
builder.append("IV");
num -= 4;
}
while (num > 0) {
builder.append("I");
num -= 1;
}
return String.valueOf(builder);
}
}
逻辑不是很复杂,优化效果不明显。