leetcode——12. 整数转罗马数字

还需优化。。。

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

我的前方是万里征途,星辰大海!!
原文地址:https://www.cnblogs.com/taoyuxin/p/11692881.html