• 算法leetcode|12. 整数转罗马数字(rust重拳出击)




    12. 整数转罗马数字:

    罗马数字包含以下七种字符: IVXLCDM

    字符          数值
    I             1
    V             5
    X             10
    L             50
    C             100
    D             500
    M             1000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II

    通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

    • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
    • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
    • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

    给你一个整数,将其转为罗马数字。

    样例 1:

    输入: 
    	num = 3
    	
    输出: 
    	"III"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    样例 2:

    输入: 
    	num = 4
    	
    输出: 
    	"IV"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    样例 3:

    输入: 
    	num = 9
    	
    输出: 
    	"IX"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    样例 4:

    输入: 
    	num = 58
    	
    输出: 
    	"LVIII"
    	
    解释: 
    	L = 50, V = 5, III = 3.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    样例 5:

    输入: 
    	num = 1994
    	
    输出: 
    	"MCMXCIV"
    	
    解释: 
    	M = 1000, CM = 900, XC = 90, IV = 4.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    提示:

    • 1 <= num <= 3999

    原题传送门:

    https://leetcode.cn/problems/integer-to-roman/description/


    分析

    • 面对这道算法题目,二当家的陷入了沉思。
    • 直接打表,把所有可能的取值都放入字典,简单粗暴。
    • 事实上,我们可以按照个,十,百,千位打表,能少很多。

    题解

    rust

    const THOUSANDS: [&'static str; 4] = ["","M", "MM", "MMM"]; //1000~3000
    const HUNDREDS: [&'static str; 10] = ["","C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"]; //100~900
    const TENS: [&'static str; 10] = ["","X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"]; //10~90
    const ONES: [&'static str; 10] = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"]; //1~9
    
    impl Solution {
    
        pub fn int_to_roman(mut num: i32) -> String {
            let n = num as usize;
            let mut roman = THOUSANDS[n / 1000].to_string();
            roman.push_str(HUNDREDS[(n % 1000) / 100]);
            roman.push_str(TENS[(n % 100) / 10]);
            roman.push_str(ONES[n % 10]);
            roman
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    go

    var (
        thousands = []string{"", "M", "MM", "MMM"}
        hundreds  = []string{"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}
        tens      = []string{"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}
        ones      = []string{"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}
    )
    
    func intToRoman(num int) string {
        return thousands[num/1000] + hundreds[num%1000/100] + tens[num%100/10] + ones[num%10]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    c++

    const string thousands[] = {"", "M", "MM", "MMM"};
    const string hundreds[]  = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
    const string tens[]      = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
    const string ones[]      = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
    
    class Solution {
    public:
        string intToRoman(int num) {
            return thousands[num / 1000] + hundreds[num % 1000 / 100] + tens[num % 100 / 10] + ones[num % 10];
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    java

    class Solution {
        private static final String[] thousands = {"", "M", "MM", "MMM"};
        private static final String[] hundreds  = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
        private static final String[] tens      = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
        private static final String[] ones      = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
    
        public String intToRoman(int num) {
            StringBuilder roman = new StringBuilder();
            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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    typescript

    const thousands = ["", "M", "MM", "MMM"];
    const hundreds = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"];
    const tens     = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"];
    const ones     = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"];
    
    function intToRoman(num: number): string {
    	const roman = [];
        roman.push(thousands[Math.floor(num / 1000)]);
        roman.push(hundreds[Math.floor(num % 1000 / 100)]);
        roman.push(tens[Math.floor(num % 100 / 10)]);
        roman.push(ones[num % 10]);
        return roman.join('');
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    python

    class Solution:
        THOUSANDS = ["", "M", "MM", "MMM"]
        HUNDREDS = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"]
        TENS = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"]
        ONES = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"]
    
        def intToRoman(self, num: int) -> str:
            return Solution.THOUSANDS[num // 1000] + \
                   Solution.HUNDREDS[num % 1000 // 100] + \
                   Solution.TENS[num % 100 // 10] + \
                   Solution.ONES[num % 10]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    非常感谢你阅读本文~
    欢迎【点赞】【收藏】【评论】~
    放弃不难,但坚持一定很酷~
    希望我们大家都能每天进步一点点~
    本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~


  • 相关阅读:
    【ThreadLocal】Threadlocal的详细解释
    了解web框架
    加载配置文件内容利用反射动态创建对象和调用方法(开闭原则的体现)
    当神经网络、机械臂与中国象棋相遇,擦出了怎样的火花?
    ofxTimeMeasurements——OpenFrameworks插件,可以轻松测量C++代码任何部分的执行时间
    图论+线性基高斯消元与主元:1019T2 / P4151
    MinIo使用小结
    [springMVC学习]12、异常处理
    手写简易VueRouter
    计算机网络 实验五 RIP与OSPF实验(网络层算法)
  • 原文地址:https://blog.csdn.net/leyi520/article/details/127803413