标签:
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
标签:
原文地址:http://my.oschina.net/Tsybius2014/blog/486752