力扣算法打卡(3)——罗马数字转整数 tips该方法并不是最简甚至有些复杂只是展示自己的答案还需要向更优秀的解题思路学习。题目罗马数字包含以下七种字符:IVXLCD和M。字符数值I 1 V 5 X 10 L 50 C 100 D 500 M 1000例如 罗马数字2写做II即为两个并列的 1 。12写做XII即为XII。27写做XXVII, 即为XXVII。通常情况下罗马数字中小的数字在大的数字的右边。但也存在特例例如 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:输入:s III输出:3示例 2:输入:s IV输出:4示例 3:输入:s IX输出:9示例 4:输入:s LVIII输出:58解释:L 50, V 5, III 3.示例 5:输入:s MCMXCIV输出:1994解释:M 1000, CM 900, XC 90, IV 4.解决var romanToInt function(s) { var sum 0; var arr [I,V,X,L,C,D,M] for(let i 0;is.length;i){ if(s[i1]){ if(s[i1] arr[arr.indexOf(s[i])1] || s[i1] arr[arr.indexOf(s[i])2]){ sum - getNum(s[i]) sum getNum(s[i1]) i; }else{ sum getNum(s[i]) } }else{ sum getNum(s[i]) } } return sum }; var getNum function(num){ switch(num){ case I: return 1; break; case V: return 5; break; case X: return 10; break; case L: return 50; break; case C: return 100; break; case D: return 500; break; case M: return 1000; break; } }分析首先写一个方法getNum用来返回对应每个罗马数字的值一个arr数组按顺序记录罗马数字用于特殊情况的匹配for循环遍历给定的罗马数字分两种情况该位置后如果没有字符就不会出现特殊情况直接加上对应的数值即可该位置后如果还有字符就要判断是否符合特殊情况符合特殊情况如果当前位置的后一位与arr数组中对应位置的后一位或者后两位相同就符合特殊情况例如IVV在I的后一位IXX在I的后两位此时当前位置减去相应的值后一位可以直接加上对应的值就可以跳过后一位的判断令i此步可以省略只是起到了提升效率的作用如果不符合特殊情况依然直接加上对应的数值即可。遍历结束后返回最后的数字结果。二编过了很久再来看当初写的这道题用了很笨的方法感慨一下代码的敲多了思路自然就打开了展示一下最新的解题思路罗马数字一一对应具体的值遍历字符串如果当前值比下一索引的值大就加当前值如果当前值比下一索引的值小就减当前值。/** * param {string} s * return {number} */ var romanToInt function(s) { let sum 0 const obj { I:1, V:5, X:10, L:50, C:100, D:500, M:1000 } for (let i 0;is.length;i){ if(is.length obj[s[i]] obj[s[i1]]){ sum - obj[s[i]]; }else{ sum obj[s[i]] } } return sum };用这个思路可以更简单的实现。