算法(附思维导图 + 全部解法)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;
}
#算法工程师##学习路径#
全部评论

相关推荐

面试官全程关摄像头1.自我介绍一下2.React和Vue哪个更熟悉一点3.你在之前那段实习经历中有没有什么技术性的突破(我只是实习了44天工作28天,我把我能说的都说了)4.你封装的哪个表单组件支不支持动态传值5.自己在实习阶段Vue3项目封装过hook吗6.hook有什么作用7.Vue2和Vue3的响应式区别(我说一个是proxy是拦截所有的底层操作,Object.defineProperty本身就是一个底层操作,有些东西拦截不了,比如数组的一些操作还有等等,面试官就说实在要拦截能不能拦截????我心想肯定不行呀,他的底层机制就不允许吧)8.pinia和vuex的区别(这个回答不出来是我太久没用了)9.pinia和zustand的区别,怎么选(直接给我干懵了)(我说react能用pinia吗&nbsp;&nbsp;他说要用的话也可以)10.渲染一万条数据,怎么解决页面卡顿问题(我说分页、监听滚轮动态加载,纯数据展示好像还可以用canvas画)(估计是没说虚拟表单,感觉不满意)11.type和interface的区别12.ts的泛型有哪些作用(我就说了一个结构相同但是类型不同的时候可以用,比如请求响应的接口,每次的data不同,这里能用一个泛型,他问我还有什么)13.你项目用的是React,如果让你再写一遍你会选择什么14.pnpm、npm、yarn的区别15.dependencies和devdependencies的区别总而言之太久没面试了,上一段实习的面试js问了很多。结果这次js一点没问,网络方面也没考,表现得很一般,但是知道自己的问题了&nbsp;&nbsp;好好准备,等待明天的影石360和周四的腾讯了&nbsp;&nbsp;加油!!!
解zj:大三的第一段面试居然是这样的结局
查看15道真题和解析
点赞 评论 收藏
分享
评论
点赞
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务