javascript练习题之整数转罗马数字

题目:
在这里插入图片描述

示例一: 输入: 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值