1、题目名称
Integer to Roman (阿拉伯数字到罗马数字的转换)
2、题目地址
https://leetcode.com/problems/integer-to-roman
3、题目内容
英文:Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999.
中文:给出一个整数,将它转换成罗马数字。输入在1-3999之间。
4、题目分析
将阿拉伯数字转换为罗马数字,首先需要了解一下罗马数字的生成规则。罗马数字共有7个,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000),它的生成规则较为复杂,具体可以参考维基百科条目:罗马数字(中文|英文)。虽然写罗马数字是件比较繁琐的事情,但将十进制数字转换为罗马数字,却有一个简单的规律,可以从下面这张表中看到:
可以看到,与十进制数字相比,虽然在个位、十位、百位、千位这些数位上罗马数字的写法各不相同,但却都有着共同规律。从纵向比较看,每一个数位的写法只和该数位对应的一倍、五倍、十倍对应的字母有关。如8的罗马数字是VIII(5+1+1+1),80是LXXX(50+10+10+10),800是DCCC(500+100+100+100)。因此我们就可以将十进制数字的各位取出,按照罗马数字各数位的字符生成规则,生成对应的罗马数字。
5、解题方法1
按照第四节中的分析,实现代码如下:
/**
* 功能说明:LeetCode 12 - Integer to Roman
* 开发人员:Tsybius
* 开发时间:2015年8月2日
*/
public class Solution {
/**
* 阿拉伯数字转罗马数字(3999及以下)
* @param num 被转换的阿拉伯数字
* @return 转换后的罗马数字
*/
public String intToRoman(int num) {
String result = "";
if (num >= 1000) {
result += getRomanMultipleOf1000(num - num % 1000);
num %= 1000;
}
if (num >= 100) {
result += getRomanMultipleOf100(num - num % 100);
num %= 100;
}
if (num >= 10) {
result += getRomanMultipleOf10(num - num % 10);
num %= 10;
}
result += getRomanLowerEqualThan10(num);
return result;
}
/**
* 小于10的罗马数字
* @param num
* @return
*/
public String getRomanLowerEqualThan10(int num) {
switch(num) {
case 1: return "I";
case 2: return "II";
case 3: return "III";
case 4: return "IV";
case 5: return "V";
case 6: return "VI";
case 7: return "VII";
case 8: return "VIII";
case 9: return "IX";
default: return "";
}
}
/**
* 10的倍数
* @param num
* @return
*/
public String getRomanMultipleOf10(int num) {
switch(num) {
case 10: return "X";
case 20: return "XX";
case 30: return "XXX";
case 40: return "XL";
case 50: return "L";
case 60: return "LX";
case 70: return "LXX";
case 80: return "LXXX";
case 90: return "XC";
default: return "";
}
}
/**
* 100的倍数
* @param num
* @return
*/
public String getRomanMultipleOf100(int num) {
switch(num) {
case 100: return "C";
case 200: return "CC";
case 300: return "CCC";
case 400: return "CD";
case 500: return "D";
case 600: return "DC";
case 700: return "DCC";
case 800: return "DCCC";
case 900: return "CM";
default: return "";
}
}
/**
* 1000的倍数
* @param num
* @return
*/
public String getRomanMultipleOf1000(int num) {
switch(num) {
case 1000: return "M";
case 2000: return "MM";
case 3000: return "MMM";
default: return "";
}
}
}
6、解题方法2
方法1中的代码过于冗长,类似的代码重写了多次,我们可以用数组来缩短代码行数:
/**
* 功能说明:LeetCode 12 - Integer to Roman
* 开发人员:Tsybius
* 开发时间:2015年8月2日
*/
public class Solution {
/**
* 阿拉伯数字转罗马数字(3999及以下)
* @param num 被转换的阿拉伯数字
* @return 转换后的罗马数字
*/
public String intToRoman(int num) {
String[][] RomanDict = new String[][] {
{ "", "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", "", "", "", "", "", "", "" },
};
return RomanDict[3][num / 1000] +
RomanDict[2][num % 1000 / 100] +
RomanDict[1][num % 100 / 10] +
RomanDict[0][num % 10];
}
}
END
来源:oschina
链接:https://my.oschina.net/u/1425762/blog/486752