LeetCode:Integer to Roman

1、题目名称

Integer to Roman (阿拉伯数字到罗马数字的转换)

2、题目地址

https://leetcode.com/problems/integer-to-roman

3、题目内容

英文:Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999.

中文:给出一个整数,将它转换成罗马数字。输入在1-3999之间。

4、题目分析

将阿拉伯数字转换为罗马数字,首先需要了解一下罗马数字的生成规则。罗马数字共有7个,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000),它的生成规则较为复杂,具体可以参考维基百科条目:罗马数字(中文英文)。虽然写罗马数字是件比较繁琐的事情,但将十进制数字转换为罗马数字,却有一个简单的规律,可以从下面这张表中看到:

可以看到,与十进制数字相比,虽然在个位、十位、百位、千位这些数位上罗马数字的写法各不相同,但却都有着共同规律。从纵向比较看,每一个数位的写法只和该数位对应的一倍、五倍、十倍对应的字母有关。如8的罗马数字是VIII(5+1+1+1),80是LXXX(50+10+10+10),800是DCCC(500+100+100+100)。因此我们就可以将十进制数字的各位取出,按照罗马数字各数位的字符生成规则,生成对应的罗马数字。

5、解题方法1

按照第四节中的分析,实现代码如下:

/**
 * 功能说明:LeetCode 12 - Integer to Roman
 * 开发人员:Tsybius
 * 开发时间:2015年8月2日
 */
public class Solution {
    
    /**
     * 阿拉伯数字转罗马数字(3999及以下)
     * @param num 被转换的阿拉伯数字
     * @return 转换后的罗马数字
     */
    public String intToRoman(int num) {

        String result = "";

        if (num >= 1000) {
            result += getRomanMultipleOf1000(num - num % 1000);
            num %= 1000;
        }
        if (num >= 100) {
            result += getRomanMultipleOf100(num - num % 100);
            num %= 100;
        }
        if (num >= 10) {
            result += getRomanMultipleOf10(num - num % 10);
            num %= 10;
        }
        
        result += getRomanLowerEqualThan10(num);
        
        return result;
    }
    
    /**
     * 小于10的罗马数字
     * @param num
     * @return
     */
    public String getRomanLowerEqualThan10(int num) {
        switch(num) {
            case 1: return "I";
            case 2: return "II";
            case 3: return "III";
            case 4: return "IV";
            case 5: return "V";
            case 6: return "VI";
            case 7: return "VII";
            case 8: return "VIII";
            case 9: return "IX";
            default: return "";
        }
    }
    
    /**
     * 10的倍数
     * @param num
     * @return
     */
    public String getRomanMultipleOf10(int num) {
        switch(num) {
            case 10: return "X";
            case 20: return "XX";
            case 30: return "XXX";
            case 40: return "XL";
            case 50: return "L";
            case 60: return "LX";
            case 70: return "LXX";
            case 80: return "LXXX";
            case 90: return "XC";
            default: return "";
        }        
    }
    
    /**
     * 100的倍数
     * @param num
     * @return
     */
    public String getRomanMultipleOf100(int num) {
        switch(num) {
            case 100: return "C";
            case 200: return "CC";
            case 300: return "CCC";
            case 400: return "CD";
            case 500: return "D";
            case 600: return "DC";
            case 700: return "DCC";
            case 800: return "DCCC";
            case 900: return "CM";
            default: return "";
        }
    }

    /**
     * 1000的倍数
     * @param num
     * @return
     */
    public String getRomanMultipleOf1000(int num) {
        switch(num) {
            case 1000: return "M";
            case 2000: return "MM";
            case 3000: return "MMM";
            default: return "";
        }
    }
}

6、解题方法2

方法1中的代码过于冗长,类似的代码重写了多次,我们可以用数组来缩短代码行数:

/**
 * 功能说明:LeetCode 12 - Integer to Roman
 * 开发人员:Tsybius
 * 开发时间:2015年8月2日
 */
public class Solution {
    
    /**
     * 阿拉伯数字转罗马数字(3999及以下)
     * @param num 被转换的阿拉伯数字
     * @return 转换后的罗马数字
     */
    public String intToRoman(int num) {

        String[][] RomanDict = new String[][] {
            { "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" },
            { "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC" },
            { "", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM" },
            { "", "M", "MM", "MMM", "", "", "", "", "", "", "" },
        };

        return RomanDict[3][num / 1000] + 
            RomanDict[2][num % 1000 / 100] +
            RomanDict[1][num % 100 / 10] +
            RomanDict[0][num % 10];
    }
}

END

时间: 2024-10-02 06:17:52

LeetCode:Integer to Roman的相关文章

LeetCode之Integer to Roman, Roman to Integer

罗马数字以前只接触过I到VIII,第一次听说罗马数字也可以表示大于8的数字.阿拉伯数字和罗马数字之间的转换最重的是了解罗马数字的规则.Wiki了一把,又参考了其它的文档,总结如下: 罗马数字规则: 1, 罗马数字共有7个,即I(1).V(5).X(10).L(50).C(100).D(500)和M(1000). 罗马数字中没有"0". 2, 重复次数:一个罗马数字最多重复3次. 3, 右加左减: 在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字. 在较大的罗马数字的左边记上

LeetCode 012 Integer to Roman

[题目] Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. [题意] 给定一个整数,将其表示成罗马数字 [思路] 罗马数字中只使用如下七个基值字母:M,D,C,L,X,V,I,分别用来表示1000.500.100.50.10.5.1. 罗马数组数规则: 基本数字Ⅰ.X .C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成

【LeetCode】Integer to Roman

Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. public class Solution { public String intToRoman(int num) { StringBuilder sb = new StringBuilder(); if(num==0) return sb.toString(); while(num

每日算法之十一:Integer to Roman

题目:Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. 罗马表示方式如下: I = 1; V = 5; X = 10; L = 50; C = 100; D = 500; M = 1000; 其中每两个阶段的之间有一个减法的表示,比如900=CM, C写在M前面表示M-C. 范围给到3999,感觉情况不多直接打表其实更快,用代码判断

[LeetCode][Python]Integer to Roman

# -*- coding: utf8 -*-'''__author__ = '[email protected]'https://oj.leetcode.com/problems/integer-to-roman/Integer to Roman Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999.===Comments by Daba

LeetCode:Integer to English Words - 按英语读法输出数字对应单词

1.题目名称 Integer to English Words(按英语读法输出数字对应单词) 2.题目地址 https://leetcode.com/problems/integer-to-english-words/ 3.题目内容 英文:Convert a non-negative integer to its english words representation. Given input is guaranteed to be less than 231 - 1. 中文:给出一个非负整数

leetCode 12. Integer to Roman | 字符串 | Medium

12. Integer to Roman Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. 题目大意: 将一个给定的阿拉伯数字转换成罗马数字. 思路: 这题看到的时候,想的太多. 其实很简单,将千位,百位,十位,个位都表示出来,然后组合即可. 代码如下: class Solution { public:     string int

【LeetCode】Integer to Roman (2 solutions)

Integer to Roman Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. 逐区间做处理. 解法一:非递归 class Solution { public: string intToRoman(int num) { string ret; //M<-->1000 while(num >= 1000) { ret +=

[LeetCode][JavaScript]Integer to Roman

Integer to Roman Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. https://leetcode.com/problems/integer-to-roman/ 阿拉伯数字转罗马数字. 造表,把有所的基数都放到表中,主要是要放入IV,IX这类数,方便处理. 从大到小匹配表中的数,一轮循环搞定. 1 /** 2 *