还需优化。。。
class Solution: def intToRoman(self, num: int) -> str: memo={'I':1,'IV':4,'V':5,'IX':9,'X':10,'XL':40,'L':50,'XC':90,'C':100,'CD':400,'D':500,'CM':900,'M':1000} a='' res=num b=[] for k in memo.keys(): b.append(k) while res!=0: if res>=memo[b[-1]]: #print(b[-1]) res-=memo[b[-1]] a+=b[-1] else: for i in range(len(b)-1): if memo[b[i]]<=res<memo[b[i+1]]: #print(b[i]) res-=memo[b[i]] a+=b[i] return a
执行用时 :92 ms, 在所有 python3 提交中击败了27.24%的用户
内存消耗 :13.8 MB, 在所有 python3 提交中击败了5.26%的用户
——2019.10.17
java 就用很笨的办法进行了枚举:
public String intToRoman(int num) { StringBuilder sb = new StringBuilder(); if(num == 4) return "IV"; else if(num == 9) return "IX"; else if(num == 40) return "XL"; else if(num == 90) return "XC"; else if(num == 400) return "CD"; else if(num == 900) return "CM"; else{ while(num / 1000 != 0){ sb.append("M"); num = num - 1000; } while(num / 900 != 0){ sb.append("CM"); num = num - 900; } while(num / 500 != 0){ sb.append("D"); num = num -500; } while(num / 400 != 0){ sb.append("CD"); num = num - 400; } while(num / 100 != 0){ sb.append("C"); num = num - 100; } while(num / 90 != 0){ sb.append("XC"); num = num - 90; } while(num / 50 != 0){ sb.append("L"); num = num - 50; } while(num / 40 != 0){ sb.append("XL"); num = num - 40; } while(num / 10 != 0){ sb.append("X"); num = num - 10; } while(num / 9 != 0){ sb.append("IX"); num = num - 9; } while(num / 5 != 0){ sb.append("V"); num = num - 5; } while(num / 4 != 0){ sb.append("IV"); num = num - 4; } while(num != 0){ sb.append("I"); num = num - 1; } } return sb.toString(); }
一样的思路,但是人家的多优化啊,多简洁:
public static String intToRoman(int num) { if (num < 1 || num > 3999) return ""; int[] number = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; String[] roman = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}; int i = 0; StringBuilder ans = new StringBuilder(); while (num > 0) { while (num >= number[i]) { num -= number[i]; ans.append(roman[i]); } ++i; // 数字值从大到小,所以直接往下遍历就可,不需要每次都重复整个遍历 } return ans.toString(); }
——2020.7.7