LeetCode:Integer to Roman

本文介绍了一种将整数转换为罗马数字的算法,并提供了两种实现方法。首先概述了罗马数字的基本规则与注意事项,接着详细解释了如何通过预设字符串数组或逐位判断的方式来完成转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
Given an integer, convert it to a roman numeral.

Input is guaranteed to be within the range from 1 to 3999.

题目大意:把一个整数变成罗马数字,输入数字是1-3999
先恶补一下罗马数字相关知识:
    最常见的罗马数字就是钟表的表盘符号:
        I, II, III, IV(也作IIII), V, VI, VII, VIII, IX, X, XI, XII...
    1、基本字符:
        1-I,5-V,10-X,50-L,100-C,500-D,1000-M
    2、基本规则:
        a、相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;
        b、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
        c、小的数字,(限于I、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;
        d、正常使用时,连写的数字重复不得超过三次。(表盘上的四点钟“IIII”例外)
        e、在一个数的上面画一条横线,表示这个数扩大1000倍。
    3、注意事项:
        a、基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。
        b、不能把基本数字V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。
        c、V 和X 左边的小数字只能用Ⅰ。
        d、L 和C 左边的小数字只能用X。
        e、D 和M 左边的小数字只能用C。
    4、举例:
        a、个位数举例
            Ⅰ,1 】Ⅱ,2】 Ⅲ,3】 Ⅳ,4 】Ⅴ,5 】Ⅵ,6】Ⅶ,7】 Ⅷ,8 】Ⅸ,9 】
        b、十位数举例
            Ⅹ,10】 Ⅺ,11 】ⅫII,13】 XIV,14】 XV,15 】XVI,16 】XVII,17 】XVIII,18】 XIX,19】 XX,20】 XXI,21 】XXII,22 】XX
            XXXIX,39】 XL,40】 L,50 】LI,51】 LV,55】 LX,60】 LXV,65】 LXXX,80】 XC,90 】XCIII,93】 XCV,95 】XCVIII,98】 XCIX,99 】
        c、百位数举例
            C,100】 CC,200 】CCC,300 】CD,400】 D,500 】DC,600 】DCC,700】 DCCC,800 】CM,900】 CMXCIX,999】
        d、千位数举例
            M,1000】 MC,1100 】MCD,1400 】MD,1500 】MDC,1600 】MDCLXVI,1666】 MDCCCLXXXVIII,1888 】MDCCCXCIX,1899 】
            MCM,1900 】MCMLXXVI,1976】 MCMLXXXIV,1984】 MCMXC,1990 】MM,2000 】MMMCMXCIX,3999】
        e、千位数以上
            这个时候就要在字幕上面划横线了,纯字符没法表示
**/

public class Solution {
    public String intToRoman(int num) {
        //return solve1(num);
        return solve2(num);
    }
    
    //============================ solve1 ================================
    //直接预存储个、十、百、千位所有的值
    //如果要说有什么可以改进的话,最后那里形成result的地方别用加号,用StringBuffer或者StringBuilder  
    private String solve1(int num){
        String[] str3 = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
        String[] str2 = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
        String[] str1 = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
        String[] str0 = {"", "M", "MM", "MMM"};
        
        int num0 = num / 1000;
        num %= 1000;
        
        int num1 = num / 100;
        num %= 100;
        
        int num2 = num / 10;
        num %= 10;
        
        int num3 = num;
        
        String result = str0[num0] + str1[num1] + str2[num2] + str3[num3];
        return result;
    }
    
    //============================ solve2 ================================
    //这是另外一种方式,我觉得这两个差不多
    //不过使用的字符串少了一些,方法更巧妙了,同样可以使用用StringBuffer或者StringBuilder进行加速
    private String solve2(int num){
        String result = "";
        String[] str = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};  
        int[] nums={1000,900,500,400,100,90,50,40,10,9,5,4,1};  
        
        int i = 0;
        while(num != 0){
            if(num >= nums[i]){
                num -= nums[i];
                result += str[i];
            }else{
                i++;
            }
        }
        
        return result;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值