leetCode 13 Roman to Integer

https://leetcode.windliang.cc/ 第一時間發(fā)布

題目描述(簡單難度)

image

和上一道題相反,將羅馬數(shù)字轉(zhuǎn)換成阿拉伯?dāng)?shù)字。

解法一

先來一種不優(yōu)雅的,也就是我開始的想法。就是遍歷字符串,然后轉(zhuǎn)換就可以窿锉,但同時得考慮 IV酌摇,IX 那些特殊情況膝舅。

public int getInt(char r) {
        int ans = 0;
        switch (r) {
        case 'I':
            ans = 1;
            break;
        case 'V':
            ans = 5;
            break;
        case 'X':
            ans = 10;
            break;
        case 'L':
            ans = 50;
            break;
        case 'C':
            ans = 100;
            break;
        case 'D':
            ans = 500;
            break;
        case 'M':
            ans = 1000;
        }
        return ans;
    }

    public int getInt(char r, char r_after) {
        int ans = 0;
        switch (r) {
        case 'I':
            ans = 1;
            break;
        case 'V':
            ans = 5;
            break;
        case 'X':
            ans = 10;
            break;
        case 'L':
            ans = 50;
            break;
        case 'C':
            ans = 100;
            break;
        case 'D':
            ans = 500;
            break;
        case 'M':
            ans = 1000;
            break;
        }
        if (r == 'I') {
            switch (r_after) {
            case 'V':
                ans = 4;
                break;
            case 'X':
                ans = 9;
            }
        }
        if (r == 'X') {
            switch (r_after) {
            case 'L':
                ans = 40;
                break;
            case 'C':
                ans = 90;
            }
        }
        if (r == 'C') {
            switch (r_after) {
            case 'D':
                ans = 400;
                break;
            case 'M':
                ans = 900;
            }
        }
        return ans;

    }

    public boolean isGetTwoInt(char r, char r_after) {
        if (r == 'I') {
            switch (r_after) {
            case 'V':
                return true;
            case 'X':
                return true;
            }
        }
        if (r == 'X') {
            switch (r_after) {
            case 'L':
                return true;
            case 'C':
                return true;
            }
        }
        if (r == 'C') {
            switch (r_after) {
            case 'D':
                return true;
            case 'M':
                return true;
            }
        }
        return false;

    }

    public int romanToInt(String s) {
        int ans = 0;
        for (int i = 0; i < s.length() - 1; i++) {
            ans += getInt(s.charAt(i), s.charAt(i + 1));
            //判斷是否是兩個字符的特殊情況
            if (isGetTwoInt(s.charAt(i), s.charAt(i + 1))) {
                i++;
            }
        }
        //將最后一個字符單獨判斷,如果放到上邊的循環(huán)會越界
        if (!(s.length() >= 2 && isGetTwoInt(s.charAt(s.length() - 2), s.charAt(s.length() - 1)))) {
            ans += getInt(s.charAt(s.length() - 1));
        }

        return ans;
    }

時間復(fù)雜度:O(n)窑多,n 是字符串的長度仍稀。

空間復(fù)雜度:O(1)。

下邊分享一些優(yōu)雅的埂息。

解法二

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

public int romanToInt(String s) {
     int sum=0;
    if(s.indexOf("IV")!=-1){sum-=2;}
    if(s.indexOf("IX")!=-1){sum-=2;}
    if(s.indexOf("XL")!=-1){sum-=20;}
    if(s.indexOf("XC")!=-1){sum-=20;}
    if(s.indexOf("CD")!=-1){sum-=200;}
    if(s.indexOf("CM")!=-1){sum-=200;}
    
    char c[]=s.toCharArray();
    int count=0;
    
   for(;count<=s.length()-1;count++){
       if(c[count]=='M') sum+=1000;
       if(c[count]=='D') sum+=500;
       if(c[count]=='C') sum+=100;
       if(c[count]=='L') sum+=50;
       if(c[count]=='X') sum+=10;
       if(c[count]=='V') sum+=5;
       if(c[count]=='I') sum+=1;
       
   }
   
   return sum;
    
}

把出現(xiàn)的特殊情況技潘,提前減了就可以。

時間復(fù)雜度:O(1)千康。

空間復(fù)雜度:O(1)享幽。

解法三

https://leetcode.com/problems/roman-to-integer/discuss/6509/7ms-solution-in-Java.-easy-to-understand

利用到羅馬數(shù)字的規(guī)則,一般情況是表示數(shù)字大的字母在前拾弃,數(shù)字小的字母在后值桩,如果不是這樣,就說明出現(xiàn)了特殊情況豪椿,此時應(yīng)該做減法奔坟。

 private int getVal(char c){
        switch (c){
            case 'M':
                return 1000;
            case 'D':
                return 500;
            case 'C':
                return 100;
            case 'L':
                return 50;
            case 'X' :
                return 10;
            case 'V':
                return 5;
            case 'I':
                return 1;
        }
        throw new IllegalArgumentException("unsupported character");
    }
    
    public int romanToInt(String s) {
        int res = 0;
        if(s.length() == 0) return res;
        for (int i = 0; i < s.length() - 1; i++) {
            int cur = getVal(s.charAt(i));
            int nex = getVal(s.charAt(i+1));
            if(cur < nex){
                res -= cur;
            }else{
                res += cur;
            }
        }
        return res + getVal(s.charAt(s.length()-1));
    }

時間復(fù)雜度:O(1)。

空間復(fù)雜度:O(1)搭盾。

這道題也不難咳秉,自己一開始沒有充分利用羅馬數(shù)字的特點,而是用一些 if鸯隅,switch 語句判斷是否是特殊情況澜建,看起來就很繁瑣了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滋迈,一起剝皮案震驚了整個濱河市霎奢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饼灿,老刑警劉巖幕侠,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異碍彭,居然都是意外死亡晤硕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門庇忌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舞箍,“玉大人,你說我怎么就攤上這事皆疹∈栝希” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捎迫。 經(jīng)常有香客問我晃酒,道長,這世上最難降的妖魔是什么窄绒? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任贝次,我火速辦了婚禮,結(jié)果婚禮上彰导,老公的妹妹穿的比我還像新娘蛔翅。我一直安慰自己,他們只是感情好位谋,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布山析。 她就那樣靜靜地躺著,像睡著了一般倔幼。 火紅的嫁衣襯著肌膚如雪盖腿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天损同,我揣著相機與錄音翩腐,去河邊找鬼。 笑死膏燃,一個胖子當(dāng)著我的面吹牛茂卦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播组哩,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼等龙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伶贰?” 一聲冷哼從身側(cè)響起蛛砰,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎黍衙,沒想到半個月后泥畅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡琅翻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年位仁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片方椎。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡聂抢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棠众,到底是詐尸還是另有隱情琳疏,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站空盼,受9級特大地震影響疮薇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜我注,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迟隅。 院中可真熱鬧但骨,春花似錦、人聲如沸智袭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吼野。三九已至校哎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間僵缺,已是汗流浹背适荣。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工礁遵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抱怔。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像嘀倒,于是被迫代替她去往敵國和親屈留。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容