leetCode-第十三題:Roman To Integer

題目:

題目

分析

思路一:由于是在有限的數(shù)字中將羅馬數(shù)字轉(zhuǎn)換為阿拉伯?dāng)?shù)字所以可以采取列表發(fā),將字符串可能出現(xiàn)的情況全部都列出來,然后在字符串中查找是否出現(xiàn)相應(yīng)的字符串來判斷相應(yīng)的值。如全部可能的情況如下:

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

然后又羅馬數(shù)字如"CDLXXI",先判斷"MMM"在該數(shù)字中是否出現(xiàn)疗我,然后判斷在結(jié)果中是否加上該值咆畏。由于"MMM"沒在該數(shù)字中出現(xiàn),所以不加上該值吴裤。同理旧找,發(fā)現(xiàn)最先出現(xiàn)的是"CD"就在結(jié)果中加上400,然后出現(xiàn)的是"LXX"就加上70嚼摩,最后出現(xiàn)的是"I"就加上1钦讳,得到471。這個(gè)過程中唯一需要注意的就是一定要從大值開始查找枕面,如在數(shù)字中查找“XX”和“XXX”時(shí)愿卒,如果從小值查找就會(huì)出錯(cuò)(讀者可以嘗試使用“MXXX”驗(yàn)證)。
思路二:我們發(fā)現(xiàn)羅馬數(shù)字中位于左邊的值小于其右邊的值時(shí)潮秘,只需要大值減掉小值即可表示該字符串表示的值琼开,如"XL"表示L-X=50-10=40,并且需要減得情況只有一位枕荞,即不會(huì)出現(xiàn)“XXL”的情況柜候。當(dāng)羅馬數(shù)字中小值位于大值右邊時(shí),加上該小值即可躏精,如“LXX”表示L+X+X=50+10+10=70渣刷。因此只需遍歷一次羅馬數(shù)字即可,如"CDLXXI",先是“C”,即在結(jié)果中加上100矗烛,然后再是“D”辅柴,因?yàn)镃<D(100<500),所以這兩個(gè)字符表示(D-C=500-100=400),因此在結(jié)果中加上500瞭吃,再減200(處理“C”時(shí)加上了100碌嘀,而實(shí)際情況這一百應(yīng)該是被減掉的,因此應(yīng)該減掉100歪架,再減掉之前加上的100)股冗,得到400,再是“L”,直接加上50(D>L)即可和蚪,結(jié)果得到450止状,再是“X”,加上10即可(L>X)),得到460攒霹,再是“X”加上10(X=X)导俘,得到470,最后是“I”,加上1即可(X>I)剔蹋,得到最后的結(jié)果旅薄,即471。
詳細(xì)思路可以看代碼。

代碼

java版

public class Solution 
{
    public int romanToInt(String s) 
    {
        String[][] c={{"0","I","II","III","IV","V","VI","VII","VIII","IX"},
                {"0","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
                {"0","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
                {"0","M","MM","MMM"}};
        int total=0;
        for(int i=3;i>=0;i--)
        {
            for (int j=c[i].length-1;j>=0;j--)
            {
                String x=c[i][j];
                if(s.contains(x) && s.startsWith(x))
                {
                    total+=j*Math.pow(10,i);
                    s=s.substring(x.length());
                     //System.out.println(s);
                    break;
                }
            }
       }
        return total;
    }
}

java版本2

public class Solution 
{
    public int romanToInt(String s)
    {
        Map<Character,Integer> map=new HashMap<Character,Integer>();
        map.put('I',1);
        map.put('V',5);
        map.put('X',10);
        map.put('L',50);
        map.put('C',100);
        map.put('D',500);
        map.put('M',1000);

        int total=map.get(s.charAt(s.length()-1));
        int pre=total;
        for(int i=s.length()-2;i>=0;i--)
        {
            int cur=map.get(s.charAt(i));
            if(cur<pre)
            {
                total=total-cur;
            }
            else
            {
                total=total+cur;
            }
            pre=cur;
        }
        return total;
    }
}

java版本3

public class Solution 
{
    public int romanToInt(String s) 
    {
        int nums[]=new int[s.length()];
        for(int i=0;i<s.length();i++){
        switch (s.charAt(i)){
            case 'M':
                nums[i]=1000;
                break;
            case 'D':
                nums[i]=500;
                break;
            case 'C':
                nums[i]=100;
                break;
            case 'L':
                nums[i]=50;
                break;
            case 'X' :
                nums[i]=10;
                break;
            case 'V':
                nums[i]=5;
                break;
            case 'I':
                nums[i]=1;
                break;
        }
    }
    int sum=0;
    for(int i=0;i<nums.length-1;i++){
        if(nums[i]<nums[i+1])
            sum-=nums[i];
        else
            sum+=nums[i];
    }
    return sum+nums[nums.length-1];
    }
}

C語言版

int getValue(char c)
{
    switch(c)
    {
        case 'I':
        return 1;
        case 'V':
        return 5;
        case 'X':
        return 10;
        case 'L':
        return 50;
        case 'C':
        return 100;
        case 'D':
        return 500;
        case 'M':
        return 1000;
        default:
        return 0;
    }
}
int romanToInt(char* s) 
{
    int total=getValue(s[0]);
    int pre=total;
    s++;
    while(*s)
    {
        int cur=getValue(s[0]);
        if(pre<cur)
        {
            total-=2*pre;
            total+=cur;
        }
        else
        {
            total+=cur;
        }
        pre=cur;
        s++;
    }
    return total;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末少梁,一起剝皮案震驚了整個(gè)濱河市洛口,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凯沪,老刑警劉巖第焰,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異妨马,居然都是意外死亡挺举,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門烘跺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來湘纵,“玉大人,你說我怎么就攤上這事滤淳∥嗯纾” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵脖咐,是天一觀的道長(zhǎng)铺敌。 經(jīng)常有香客問我,道長(zhǎng)屁擅,這世上最難降的妖魔是什么偿凭? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮派歌,結(jié)果婚禮上弯囊,老公的妹妹穿的比我還像新娘。我一直安慰自己硝皂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布作谭。 她就那樣靜靜地躺著稽物,像睡著了一般。 火紅的嫁衣襯著肌膚如雪折欠。 梳的紋絲不亂的頭發(fā)上贝或,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音锐秦,去河邊找鬼咪奖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛酱床,可吹牛的內(nèi)容都是我干的羊赵。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼昧捷!你這毒婦竟也來了闲昭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤靡挥,失蹤者是張志新(化名)和其女友劉穎序矩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跋破,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡簸淀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毒返。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片租幕。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖饿悬,靈堂內(nèi)的尸體忽然破棺而出令蛉,到底是詐尸還是另有隱情,我是刑警寧澤狡恬,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布珠叔,位于F島的核電站,受9級(jí)特大地震影響弟劲,放射性物質(zhì)發(fā)生泄漏祷安。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一兔乞、第九天 我趴在偏房一處隱蔽的房頂上張望汇鞭。 院中可真熱鬧,春花似錦庸追、人聲如沸霍骄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽读整。三九已至,卻和暖如春咱娶,著一層夾襖步出監(jiān)牢的瞬間米间,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工膘侮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屈糊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓琼了,卻偏偏與公主長(zhǎng)得像逻锐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

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