一、題目名稱java
Integer to Roman (阿拉伯數字到羅馬數字的轉換)數組
二、題目地址code
https://leetcode.com/problems/integer-to-romanip
三、題目內容leetcode
英文:Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999.開發
中文:給出一個整數,將它轉換成羅馬數字。輸入在1-3999之間。get
四、題目分析it
將阿拉伯數字轉換爲羅馬數字,首先須要瞭解一下羅馬數字的生成規則。羅馬數字共有7個,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000),它的生成規則較爲複雜,具體能夠參考維基百科條目:羅馬數字(中文|英文)。雖然寫羅馬數字是件比較繁瑣的事情,但將十進制數字轉換爲羅馬數字,卻有一個簡單的規律,能夠從下面這張表中看到:io
能夠看到,與十進制數字相比,雖然在個位、十位、百位、千位這些數位上羅馬數字的寫法各不相同,但卻都有着共同規律。從縱向比較看,每個數位的寫法只和該數位對應的一倍、五倍、十倍對應的字母有關。如8的羅馬數字是VIII(5+1+1+1),80是LXXX(50+10+10+10),800是DCCC(500+100+100+100)。所以咱們就能夠將十進制數字的各位取出,按照羅馬數字各數位的字符生成規則,生成對應的羅馬數字。class
五、解題方法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 ""; } } }
六、解題方法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