关于算法:leetCode-每天一题-简单之路罗马数字

30次阅读

共计 1317 个字符,预计需要花费 4 分钟才能阅读完成。

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

字符 ------ 数值
I --------- 1
V --------- 5
X --------- 10
L --------- 50
C --------- 100
D --------- 500
M --------- 1000
例如 罗马数字 2 写做 II,即为两个并列的 1。12 写做 XII,即为 X + II。27 写做 XXVII, 即为 XX + V + II。
通常状况下,罗马数字中小的数字在大的数字的左边。但也存在特例,例如 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 到 3999 的范畴内。
示例 1:
输出: “III” 输入: 3
示例 2:
输出: “IV” 输入: 4
示例 3:
输出: “IX” 输入: 9
示例 4:
输出: “LVIII” 输入: 58
解释: L = 50, V= 5, III = 3.
示例 5:
输出: “MCMXCIV” 输入: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
点击查看题目的原始起源 leetCode

js 解题的思路:看题目的第一反馈就是应用对象的键值属性来设置罗马数字不同的字母代表不同的数字,而且输出的也是字符串就想着把字符串宰割(宰割之后的后果就是数值)而后遍历后果数组 再遍历对象将数组的值和对象的属性进行比拟将值进行累加

var romanToInt = function (s) {
            var data = {
                I: 1,
                V: 5,
                X: 10,
                L: 50,
                C: 100,
                D: 500,
                M: 1000
            }
            var arr = s.split('');
            var total = 0;
            for (let i = 0; i < arr.length; i++) {if (data[arr[i]] < data[arr[i + 1]]) {total += data[arr[i + 1]] - data[arr[i]];
                    total -= (data[arr[i + 1]] + data[arr[i]]);
                }
                for (const k in data) {if (k === arr[i]) {total += data[k] * 1
                    }
                }
            }
            return total;
        };
        var result = romanToInt('MCMXCIV')
        console.log(result);

这里值得注意的是:在解决 像 IV 这种状况下 是用 V - I 而不是相加 所以 须要循环的判断数组的每一个值和紧接着的数字的大小 如果后面的值比前面的值小 就是应用 total += data[arr[i + 1]] - data[arr[i]]; 来累加值,然而就导致了 累加了两者的差之后还别离的累加了这两个罗马数值 所以须要应用 total -= (data[arr[i + 1]] + data[arr[i]]); 再减去这两个值 能力失去最终的后果

总结 因为第一个念头就是应用数组和对象的办法,就始终想方法将这个办法实现 压根没有去思考应用其余的形式。有可能本人是局中人有思考不到中央 如果各方大佬有更好的办法 还请多多指教。

正文完
 0