首页 > 算法(附思维导图 + 全部解法)300题之12整数转罗马数字
头像
码农三少
发布于 2021-08-21 15:35
+ 关注

算法(附思维导图 + 全部解法)300题之12整数转罗马数字

零 标题:算法(leetode,附思维导图 + 全部解法)300题之(12)整数转罗马数字

导读:

一 题目描述

题目描述
题目描述

二 解法总览(思维导图)

思维导图

三 全部解法

1 方案1

1)代码:

var intToRoman = function(num) {
    // 1)定义普通数值(非4、9前缀的值)的转换函数
    const getNotFourNineTranStr = (tempVal) => {
        // 1.1)定义相应的数据映射
        const map = new Map([
            [1, 'I'],
            [5, 'V'],
            [10, 'X'],
            [50, 'L'],
            [100, 'C'],
            [500, 'D'],
            [1000, 'M']
        ]);
        let str = '';

        const tempArr = [1000, 500, 100, 50, 10, 5, 1],
            l = tempArr.length;
        let index = 0;

        // 1.2)从1000开始,
        // 若 tempVal>= 1000,则 str就填入 'M' && tempVal -= 1000
        // 否则若 tempVal < 1000,则 str不用动 && index++
        // 循环边界:tempVal不为0
        while (tempVal) {
            if (tempVal >= tempArr[index]) {
                str += map.get(tempArr[index]);
                tempVal -= tempArr[index];
            } else {
                index++;
            }
        }

        // 1.3)返回对应的转换后字符串
        return str;
    };

    // 2)定义 4、9前缀的值 的转换Map数据
    const map = new Map([
        [4, 'IV'],
        [40, 'XL'],
        [400, 'CD'],
        [9, 'IX'],
        [90, 'XC'],
        [900, 'CM']
    ]);

    let weight = 1,
        resStr = '';

    // 3)对此时 num 取模得到 modVal ,
    // 若 modVal 为 4、9 则直接从上面定义好的map取字符串、拼接 —— resStr = map.get(tempVal) + resStr;
    // 否则 resStr = getNotFourNineTranStr(tempVal) + resStr; 
    // 处理:weight *= 10; num = parseInt(num / 10);
    // 循环边界:num 不为 0
    while (num) {
        const modVal = num % 10;
        const tempVal = modVal * weight;

        if (modVal === 4 || modVal === 9) {
            resStr = map.get(tempVal) + resStr;
        } else {
            resStr = getNotFourNineTranStr(tempVal) + resStr;
        }

        weight *= 10;
        // 边界:别漏了 parseInt ,不能写成 num /= 10、会带上小数点!
        num = parseInt(num / 10);
    }

    // 4)返回结果字符串 resStr
    return resStr;
};

2 方案2

1)代码:

var intToRoman = function(num) {
    const l = num.length,
    // 1)定义新的“映射数据”
        tempArr = [
        [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']
    ];

    let index = 0,
        resStr = '';

    // 2)循环处理
    // 从 tempArr[0] 开始取值,const [val, valStr] = tempArr[index];
    // 若 num >= val,则 resStr 拼接valStr && num 减去 val值
    // 否则若 num < val,则说明当前 tempArr[index][0] 过大,我们 下标index 需往后走,即 index++; 
    // 循环边界:num 不为 0
    while (num) {
        const [val, valStr] = tempArr[index];
        if (num >= val) {
            resStr += valStr;
            num -= val;
        } else {
            index++;
        }
    }

    // 3)返回拼接好的 resStr 
    return resStr;
}

3 方案3

1)代码:

var intToRoman = function(num) {
    // 1)建立“所有可能的数据映射集”
    const mArr = ["", "M", "MM", "MMM"], // 1000, 2000, 3000
        cArr = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"], // 100~900
        xArr = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"], // 10~90
        iArr = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"]; // 1~9

    // 下面的 第1、4行可以精简,这里为了格式统一、所以加上一些不必要的处理。
    // 2)根据“运算结果”,从“上面的映射集”中取得我们的映射字符串、拼接在 resStr 中。
    const resStr = mArr[parseInt((num % 10000) / 1000)]
        + cArr[parseInt((num % 1000) / 100)]
        + xArr[parseInt((num % 100) / 10)]
        + iArr[parseInt((num % 10) / 1)];

    // 3)返回结果字符串 resStr 。
    return resStr;
}

全部评论

(0) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期精华帖

热门推荐