【题目】
罗马数字包含以下七种字符: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: 输入: 3 输出: "III" 示例 2: 输入: 4 输出: "IV" 示例 3: 输入: 9 输出: "IX" 示例 4: 输入: 58 输出: "LVIII" 解释: L = 50, V = 5, III = 3. 示例 5: 输入: 1994 输出: "MCMXCIV" 解释: M = 1000, CM = 900, XC = 90, IV = 4.
【解法】
/**
* @param {number} num
* @return {string}
*/
var intToRoman = function(num) {
let bitRrr = ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'];
let tenArr = ['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'];
let hundredArr = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'];
let thousandArr = ['M', 'MM', 'MMM'];
let result = 0;
let bit = num % 10;
let ten = (num % 100 - bit) / 10;
let hundred = (num % 1000 - ten * 10 - bit) / 100;
let thousand = (num - hundred * 100 - ten * 10 - bit) / 1000;
if (num < 10) {
result = '' + bitRrr[bit];
}
if (num >= 10 && num < 100) {
result = '' + tenArr[ten] + bitRrr[bit];
}
if (num >= 100 && num < 1000) {
result = '' + hundredArr[hundred] + tenArr[ten] + bitRrr[bit];
}
if (num >= 1000 && num < 4000) {
result = '' + thousandArr[thousand - 1] + hundredArr[hundred] + tenArr[ten] + bitRrr[bit];
}
return result
};
【参考解法】
/**
* @param {number} num
* @return {string}
*/
var romanToInt = function(s) {
var romanArr = [];
var result = 0;
romanArr['I'] = 1;
romanArr['V'] = 5;
romanArr['X'] = 10;
romanArr['L'] = 50;
romanArr['C'] = 100;
romanArr['D'] = 500;
romanArr['M'] = 1000;
for (var i = 0; i < s.length; i++) {
// 先判断最后一位的最后一位是否存在,如果不存在,例如“I”,只有一位,所以就返回 1。
if (!romanArr[s[i + 1]]) {
result += romanArr[s[i]];
break;
};
// 如果前一个数比后一个数大,把前一个数再添加到结果中
if (romanArr[s[i]] >= romanArr[s[i + 1]]) {
result += romanArr[s[i]];
} else {
// 如果前一个数小于后一个数,将结果加上后位进行运算,记得 i+1
result = result + romanArr[s[i + 1]] - romanArr[s[i]];
i++;
};
};
return Number(result);
};
随心远行,宁静致远。
人生所有的时间,都不是虚度的,你只要经过,肯定会留下痕迹,会变得成熟。