本道题的思路是将1000, 500, 100, 50, 10, 5, 1对应的罗马数字按序存入数组strs中(索引为0,1,2,3,4,5,6),先计算千、百、十、个为书上的值,将其存入数组中(索引为0,1,2,3),千位数没有特殊情况,StringBuilder变量直接循环拼接千位数的值个 对应的罗马数字,而百、十、个位就需要考虑特殊情况,应为情况相似,可以在循环中判断,一共需要分为四种情况(=9,=4,>= 5, <5),如果值为9,则先拼接strs[2*i],再拼接strs[2*i-2],如果值为4,则先拼接strs[2*i],再拼接strs[2*i-1],如果大于5,则先拼接strs[2*i - 1],再循环凭借(n-5)个strs[2i],如果小于5,则循环凭借n个strs[2i]
class Solution {
public String intToRoman(int num) {
int dLength = 4, length = 7;
StringBuilder sb = new StringBuilder();
int[] divisors = {1000, 500, 100, 50, 10, 5, 1};
String[] strs = {"M", "D", "C", "L", "X", "V", "I"};
int[] results = new int[dLength];
for (int i=0;i<dLength;i++) {
int result = num / divisors[2*i];
num = num % divisors[2*i];
results[i] = result;
}
int result = results[0];
while (result != 0) {
sb.append(strs[0]);
result -- ;
}
for (int i = 1;i<dLength;i++) {
result = results[i];
if (result == 9) {
sb.append(strs[2*i]);
sb.append(strs[2*i - 2]);
} else if (result == 4) {
sb.append(strs[2*i]);
sb.append(strs[2*i - 1]);
} else if (result >= 5) {
sb.append(strs[2*i - 1]);
while ((result - 5) != 0) {
sb.append(strs[2*i]);
result --;
}
} else {
while (result != 0) {
sb.append(strs[2*i]);
result -- ;
}
}
}
return sb.toString();
}
}
不过性能不是很好,有待提高,有更好的易于理解的高性能的方法可以分享给我哟