题目:
示例一: 输入: 3 输出: “III”
示例 2: 输入: 4 输出: “IV”
示例 3: 输入: 9 输出: “IX”
示例四: 输入: 58 输出: “LVIII”
解释: L = 50, V = 5, III = 3.
示例五: 输入: 1994 输出: “MCMXCIV”
解释: M = 1000, CM = 900, XC = 90, IV = 4.
以下解法均来自底下链接的热门评论
解析一:将各位、十位、百位、千位所对应的罗马数字列出来,然后结合除法和取余求出各个位数上所对应的罗马数字
var intToRoman = function(num) {
let unit = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"];
let tens = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"];
let hund = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"];
let thous= ["", "M", "MM", "MMM"];
return thous[Math.floor(num/1000)] + hund[Math.floor((num%1000)/100)] + tens [Math.floor((num%100)/10)] + unit [num%10];
};
解析二:利用循环判断输入的数的大小,依次做减法,
var intToRoman = function(num) {
//将整数和对应的罗马数字分别放在数组中
let arr_num=[1000,900,500,400,100,90,50,40,10,9,5,4,1];
let arr_str=['M','CM','D','CD','C','XC','L','XL','X','IX','V','IV','I'];
let res='';
while(num){
//判断数组是否大于arr_num[0]中的数,也就是从千位数开始判断
if(num>=arr_num[0]){
res+=arr_str[0];
num-=arr_num[0];
}else{
//如果不大于1000了,则将数组中的1000以及相应的罗马数字移除,这样下次比较的时候arr_num[0]就可以取下位数 ,也就是900
arr_num.shift();
arr_str.shift();
}
}
return res;
};
解析三:
var intToRoman = function(num) {
//下面数组的各项分别对应 个位、十位、百位、千位中的罗马数字
let arr = [["I","V","X"],["X","L","C"],["C","D","M"],["M"]];
let res = "";
//定义一个函数,把输入的数转换位对应的arr[index]中的罗马数字,
let fun = function (n, arr_str){
if(n >= 9){
res += arr_str[0] + arr_str[2];
n -= 9;
} else if(n >= 5){
res += arr_str[1];
n -= 5;
}else if(n == 4){
res += arr_str[0] + arr_str[1];
n -= 4;
}
//下面一步是处理1-3,6-8
while(n > 0){
res += arr_str[0];
n--;
}
}
//获取数组的下标,比如千位数--->["M"],也就是arr[3],
//百位数--->["C","D","M"],也就是arr[2]
let index = arr.length;
let i = 0;
while(num > 0){
//
i = Math.pow(10, index);
//首先判断的是num是否大于1000
if(num >= i){
//如果是将千位数传入函数
fun(Math.floor(num / i), arr[index]);
//并将num赋予新的值
num %= i;
}
index--;
}
return res;
};
本文章仅作为个人的学习记录,具体解题思路请查看以下网址!
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/integer-to-roman