12. 整数转罗马数字
题目:
思路:
【1】映射表+模拟数值计算生成
【2】硬编码数字
代码展示:
映射表+模拟数值计算生成:
//时间4 ms击败41.68% //内存40.9 MB击败81.71% //时间复杂度:O(1)。由于 映射表 长度是固定的,且这 13字符中的每个字符的出现次数均不会超过 3,因此循环次数有一个确定的上限。对于本题给出的数据范围,循环次数不会超过 15 次。 //空间复杂度:O(1)。 class Solution { public String intToRoman(int num) { //构建映射表 int[] val = new int[]{1000,900,500,400,100,90,50,40,10,9,5,4,1}; String[] str = new String[]{"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"}; StringBuffer buf = new StringBuffer(); for (int i = 0; i < val.length && num > 0; i++) { int n = val[i]; while (num >= n){ buf.append(str[i]); num -= n; } } return buf.toString(); } }
硬编码数字:
//时间3 ms击败97.41% //内存41.4 MB击败28.74% //时间复杂度:O(1)。计算量与输入数字的大小无关。 //空间复杂度:O(1)。 class Solution { public String intToRoman(int num) { String[] thousands = {"", "M", "MM", "MMM"}; String[] hundreds = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}; String[] tens = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}; String[] ones = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}; StringBuffer roman = new StringBuffer(); roman.append(thousands[num / 1000]); roman.append(hundreds[num % 1000 / 100]); roman.append(tens[num % 100 / 10]); roman.append(ones[num % 10]); return roman.toString(); } }