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

來源:互聯網
上載者:User

標籤:c   c++   java   leetcode   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


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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.