Integer to Roman 问题 Integer to Roman 问题 1.问题描述 2.解题思路 3.代码实现
1.问题描述
Given an integer, convert it to a roman numeral.Input is guaranteed to be within the range from 1 to 3999.
题目翻译:
把给定的一个整数翻译成罗马数字,这个整数限定在1到3999范围内。
2.解题思路
这道题给的范围很巧妙,因为在1-3999这个范围内罗马数字是有规律可寻的:
{"","I","II","III","IV","V","VI","VII","VIII","IX"},
{"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
{"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
{"","M","MM","MMM"}
可以看到每一行只下标为4、5、9、的比较特殊,其他I、X、C、M分别代表1、10、100、1000,而V、L、D分别代表5、50、500,在此基础上构成了各个数值,也就是说只要能判断出这些特殊的情况,就能解决问题。但是当然这道题也可以用暴力解法,把这个整数一步步分解成个、十、百、千来分别查找技能解决问题。
3.代码实现
- 暴力解法
class Solution {
public String intToRoman(int num) {
String[][] c={
{"","I","II","III","IV","V","VI","VII","VIII","IX"},
{"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
{"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
{"","M","MM","MMM"}
};
StringBuffer res = new StringBuffer();
int tmp= 0;
res.append(c[3][num / 1000 % 10]);
res.append(c[2][num / 100 % 10]);
res.append(c[1][num / 10 % 10]);
res.append(c[0][num % 10]);
return res.toString();
}
}
- 利用特殊数字
class Solution {
public String intToRoman(int num) {
StringBuffer str = new StringBuffer();
String [] symbol = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
int [] value = {1000,900,500,400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
for(int i=0;num!=0;i++){
while(num >= value[i]){//循环是为了处理重复的情况
num -= value[i];
str.append(symbol[i]);
}
}
return str.toString();
}
}