LeetCode 12 Integer to Roman(C,C++,Java,Python)

Problem:

Given an integer, convert it to a roman numeral.

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

Solution:

根据数字将每一位转换为罗马字符串即可,时间复杂度O(len(num))

题目大意:

给一个整数,将整数调整为罗马数字,关于罗马数字的定义见这里:罗马数字

  • 个位数举例

    Ⅰ,1 】Ⅱ,2】 Ⅲ,3】 Ⅳ,4 】Ⅴ,5 】Ⅵ,6】Ⅶ,7】 Ⅷ,8 】Ⅸ,9 】

  • 十位数举例

    Ⅹ,10】 Ⅺ,11 】Ⅻ,12】 XIII,13】 XIV,14】 XV,15 】XVI,16 】XVII,17 】XVIII,18】 XIX,19】 XX,20】 XXI,21 】XXII,22 】XXIX,29】 XXX,30】 XXXIV,34】 XXXV,35 】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,100】 CC,200 】CCC,300 】CD,400】 D,500 】DC,600 】DCC,700】 DCCC,800 】CM,900】 CMXCIX,999】

  • 千位数举例

    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】

  • 千位数以上举例

,65,259 】

,134945584】

, 183650】

解题思路:

除了零位之外,把所有位转化为罗马数字连接即可

Java源代码(用时305ms):

public class Solution {
    public String intToRoman(int num) {
        StringBuilder sb = new StringBuilder();
        if(num/1000!=0){
            RomanDigit(sb,num/1000,"M","#","#");
            num%=1000;
        }
        if(num/100!=0){
            RomanDigit(sb,num/100,"C","D","M");
            num%=100;
        }
        if(num/10!=0){
            RomanDigit(sb,num/10,"X","L","C");
            num%=10;
        }
        if(num!=0){
            RomanDigit(sb,num,"I","V","X");
        }
        return new String(sb);
    }
    private void RomanDigit(StringBuilder sb,int digit,String a,String b,String c){
        switch(digit){
            case 1:sb.append(a);return;
            case 2:sb.append(a+a);return;
            case 3:sb.append(a+a+a);return;
            case 4:sb.append(a+b);return;
            case 5:sb.append(b);return;
            case 6:sb.append(b+a);return;
            case 7:sb.append(b+a+a);return;
            case 8:sb.append(b+a+a+a);return;
            case 9:sb.append(a+c);return;
        }
        return;
    }
}

C语言源代码(用时16ms):

int RomanDigit(char* roman,int digit,char a,char b,char c){
    switch(digit){
        case 1:roman[0]=a;return 1;
        case 2:roman[0]=a;roman[1]=a;return 2;
        case 3:roman[0]=a;roman[1]=a;roman[2]=a;return 3;
        case 4:roman[0]=a;roman[1]=b;return 2;
        case 5:roman[0]=b;return 1;
        case 6:roman[0]=b;roman[1]=a;return 2;
        case 7:roman[0]=b;roman[1]=a;roman[2]=a;return 3;
        case 8:roman[0]=b;roman[1]=a;roman[2]=a;roman[3]=a;return 4;
        case 9:roman[0]=a;roman[1]=c;return 2;
    }
    return 0;
}
char* intToRoman(int num) {
    //char digit[9][5]={I,II,III,IV,V,VI,VII,VIII,IX};
    //char tensdig[9][5]={X,XX,XXX,XL,L,LX,LXX,LXXX,XC};
    //char hunsdig[9][5]={C,CC,CCC,CD,D,DC,DCC,DCCC,CM};
    //char thodig[3][3]={M,MM,MMM};
    char* roman=(char*)malloc(sizeof(char)*16);
    int index=0;
    if(num/1000!=0){
        index+=RomanDigit(roman+index,num/1000,'M','#','#');
        num%=1000;
    }
    if(num/100!=0){
        index+=RomanDigit(roman+index,num/100,'C','D','M');
        num%=100;
    }
    if(num/10!=0){
        index+=RomanDigit(roman+index,num/10,'X','L','C');
        num%=10;
    }
    if(num!=0){
        index+=RomanDigit(roman+index,num,'I','V','X');
    }
    roman[index]=0;
    return roman;
}

C++源代码(用时50ms):

class Solution {
public:
    string intToRoman(int num) {
        char* roman=(char*)malloc(sizeof(char)*16);
        int index=0;
        if(num/1000){
            index+=RomanDigit(roman+index,num/1000,'M','#','#');
            num%=1000;
        }
        if(num/100){
            index+=RomanDigit(roman+index,num/100,'C','D','M');
            num%=100;
        }
        if(num/10){
            index+=RomanDigit(roman+index,num/10,'X','L','C');
            num%=10;
        }
        if(num){
            index+=RomanDigit(roman+index,num,'I','V','X');
        }
        roman[index]=0;
        return string(roman);
    }
private:
    int RomanDigit(char* s,int digit,char a,char b,char c){
        switch(digit){
            case 1:s[0]=a;return 1;
            case 2:s[0]=a;s[1]=a;return 2;
            case 3:s[0]=a;s[1]=a;s[2]=a;return 3;
            case 4:s[0]=a;s[1]=b;return 2;
            case 5:s[0]=b;return 1;
            case 6:s[0]=b;s[1]=a;return 2;
            case 7:s[0]=b;s[1]=a;s[2]=a;return 3;
            case 8:s[0]=b;s[1]=a;s[2]=a;s[3]=a;return 4;
            case 9:s[0]=a;s[1]=c;return 2;
        }
        return 0;
    }
};

Python源代码(用时283ms):

class Solution:
    # @param {integer} num
    # @return {string}
    def intToRoman(self, num):
        s=''
        if num/1000!=0:
            s=self.RomanDigit(s,num/1000,'M','#','#')
            num%=1000
        if num/100!=0:
            s=self.RomanDigit(s,num/100,'C','D','M')
            num%=100
        if num/10!=0:
            s=self.RomanDigit(s,num/10,'X','L','C')
            num%=10
        if num!=0:
            s=self.RomanDigit(s,num,'I','V','X')
        return s
    def RomanDigit(self,s,digit,a,b,c):
        if digit<4:
            s+=a*digit
            return s
        elif digit==4:
            s+=a+b
            return s
        elif digit<9:
            s+=b+a*(digit-5)
            return s
        else:
            s+=a+c
            return s

时间: 2024-07-31 11:50:06

LeetCode 12 Integer to Roman(C,C++,Java,Python)的相关文章

[LeetCode] 012. Integer to Roman (Medium) (C++/Java/Python)

索引:[LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 012.Integer_to_Roman (Medium) 链接: 题目:https://oj.leetcode.com/problems/integer-to-roman/ 代码(github):https://github.com/illuz/leetcode 题意: 把十进制转为罗马数. 分析: 模拟即可.

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][12]Integer to Roman解析 int转罗马字符时间复杂度为常数的实现-Java实现

Q: Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. A: 俺是真不知道啥是roman,我去查了一下合着是罗马字体,这题目意思也很简单就是说我要输入一个数字可以保证是1-3999但是你要把这个阿拉伯数字转换成罗马数字. 首先我们要清楚罗马数字怎么表示的,罗马数字表示如下: 罗 马 数字共有七个,即I(1),V(5),X(10),L

[LeetCode] 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. 解释: 罗马数字采用七个罗马字母作数字.即Ⅰ(1).X(10).C(100).M(1000).V(5).L(50).D(500).记数的方法: 相同的数字连写,所表示的数等于这些数字相加得到的数,如 Ⅲ=3: 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 Ⅷ=8.

LeetCode 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 与罗马字符转数字类似,注意按级处理. string intToRoman(int num) { string sRet; int iNum = num; while(iNum > 0) { if(iNum < 5) { if(iNum == 4) { sRet += "IV

LeetCode 12 Integer to Roman(整型数到罗马数)

翻译 给定一个整型数值,将其转换到罗马数字. 输入被保证在1到3999之间. 原文 Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. 我不会告诉你一开始我是用的无数个变量和if-- 后来实在受不了这么多变量就将其写成了枚举,那么接下来就迎刃而解了. 为了让大家理解罗马数是怎么计数的,这里我截了一张图,具体的大家可以自行用微软Bing

Leetcode 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. 翻译: 给一个整数,把他转换为罗马数字输出. 这道题是简单的字符转换的问题.只要了解罗马数字代表的含义即可. 罗马数字里面只有 1,5,10.  1到3之间用重复的1表示,4用IV 90用XC 依次类推. I = 1; V = 5; X = 10; L = 50; C = 1

[LeetCode]12. Integer to Roman整数转罗马数字

Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000 For example, two is written as II in Roman numeral, just two one's added together. Twelve is written as, XII, which i

LeetCode 12 Integer to Roman (整数转罗马数字)

题目链接: https://leetcode.com/problems/integer-to-roman/?tab=Description String M[] = {"", "M", "MM", "MMM”};//1000~3000String C[] = {"", "C", "CC", "CCC", "CD", "D&quo