零 标题:算法(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) 回帖