leetCode12. 整数转罗马数字(JavaScript)

leetCode每日一题12. 整数转罗马数字(JavaScript)

难度中等678

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符          数值
I             1
IV            4 (特殊)
V             5
IX            9(特殊)
X             10
XL            40(特殊)
L             50
LC            90 (特殊)
C             100
CD            400(特殊)
D             500
DM            900(特殊)
M             1000

思路

	根据罗马数字的唯一表示法,为了表示一个给定的整数 num,我们寻找不超过 num 的最大符号值,将 num 减去该符号值,然后继续寻找不超过 num 的最大符号值,将该符号拼接在上一个找到的符号之后,循环直至 num 为 00。最后得到的字符串即为 num 的罗马数字表示。

	编程时,可以建立一个数值-符号对的列表valueSymbols,按数值从大到小排列。遍历valueSymbols 中的每个数值-符号对,若当前数值value 不超过 num,则从 num 中不断减去 value,直至 num 小于 value,然后遍历下一个数值-符号对。若遍历中 num 为 0 则跳出循环。
  • 模拟法
    var intToRoman = function(num) {
        const valueSymbols = [[1000, "M"], [900, "CM"], [500, "D"], [400, "CD"], [100, "C"], [90, "XC"], [50, "L"], [40, "XL"], [10, "X"], [9, "IX"], [5, "V"], [4, "IV"], [1, "I"]];
        const roman = [];
        for (const [value, symbol] of valueSymbols) {
            while (num >= value) {
                num -= value;
                roman.push(symbol);
            }
            if (num == 0) {
                break;
            }
        }
        return roman.join('');
    };
    
    作者:LeetCode-Solution
    链接:https://leetcode-cn.com/problems/integer-to-roman/solution/zheng-shu-zhuan-luo-ma-shu-zi-by-leetcod-75rs/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 位数取除
    var intToRoman = function(num) {
        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"];
    
        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('');
    };
    
    作者:LeetCode-Solution
    链接:https://leetcode-cn.com/problems/integer-to-roman/solution/zheng-shu-zhuan-luo-ma-shu-zi-by-leetcod-75rs/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 类似于模拟法,更巧妙

    /**
     * @param {number} num
     * @return {string}
     */
    var intToRoman = function(num) {
        let nums=[1000,900,500,400,100,90,50,40,10,9,5,4,1],
            chars=['M','CM','D','CD','C','XC','L','XL','X','IX','V','IV','I'];
        let result='';
        while(num){
            if(num>=nums[0]){
                result+=chars[0];
                num-=nums[0];
            }else{
                nums.shift();
                chars.shift();
            }
        }
        return result;
    };
    
    作者:winfo
    链接:https://leetcode-cn.com/problems/integer-to-roman/solution/shi-yong-jsde-shiftshi-xian-yi-zhong-xun-huan-by-w/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值