13. Roman to Integer

問(wèn)題描述:
Given a roman numeral, convert it to an integer.

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

分析:
這道題需要了解羅馬數(shù)字是什么,包含哪些數(shù)字俊性。


image.png

1能曾、相同的數(shù)字連寫威彰,所表示的數(shù)等于這些數(shù)字相加得到的數(shù)氛悬,如:Ⅲ = 3克锣;
2甘有、小的數(shù)字在大的數(shù)字的右邊俄占,所表示的數(shù)等于這些數(shù)字相加得到的數(shù)管怠, 如:Ⅷ = 8;Ⅻ = 12缸榄;
3渤弛、小的數(shù)字,(限于Ⅰ甚带、X 和C)在大的數(shù)字的左邊她肯,所表示的數(shù)等于大數(shù)減小數(shù)得到的數(shù),如:Ⅳ= 4鹰贵;Ⅸ= 9晴氨;
4、正常使用時(shí)碉输,連寫的數(shù)字重復(fù)不得超過(guò)三次籽前。(表盤上的四點(diǎn)鐘“IIII”例外)
5、在一個(gè)數(shù)的上面畫一條橫線敷钾,表示這個(gè)數(shù)擴(kuò)大1000倍枝哄。

有幾條須注意掌握:
1、基本數(shù)字Ⅰ阻荒、X 挠锥、C 中的任何一個(gè),自身連用構(gòu)成數(shù)目侨赡,或者放在大數(shù)的右邊連用構(gòu)成數(shù)目蓖租,都不能超過(guò)三個(gè);放在大數(shù)的左邊只能用一個(gè)羊壹。
2蓖宦、不能把基本數(shù)字V 、L 舶掖、D 中的任何一個(gè)作為小數(shù)放在大數(shù)的左邊采用相減的方法構(gòu)成數(shù)目球昨;放在大數(shù)的右邊采用相加的方式構(gòu)成數(shù)目尔店,只能使用一個(gè)眨攘。
3主慰、V 和X 左邊的小數(shù)字只能用Ⅰ。
4鲫售、L 和C 左邊的小數(shù)字只能用X共螺。
5、D 和M 左邊的小數(shù)字只能用C情竹。

思路:

自己的方法:

基本思路就是從右往左讀字符串藐不,如果小于當(dāng)前的number,就用number減掉它秦效,否則加上它雏蛮。

首先得需要一個(gè)函數(shù)來(lái)將羅馬數(shù)字轉(zhuǎn)換成對(duì)應(yīng)的阿拉伯?dāng)?shù)字,或者新建一個(gè)字典用來(lái)存放對(duì)應(yīng)關(guān)系阱州。
根據(jù)以上思路挑秉,代碼如下:

  public int romanToInt(String s) {
        int number = 0;
        for(int i=s.length()-1; i>=0; i--){
            char c = s.charAt(i);
            int n = mapping(c);
            if(n < number) number -= n;
            else number += n;
        }
        return number;  
    }

運(yùn)行之后發(fā)現(xiàn)有錯(cuò)誤:


image.png

上面的代碼沒(méi)有考慮到兩個(gè)一樣的數(shù)字連著的情況,所以導(dǎo)致加了第一個(gè)X之后苔货,本來(lái)應(yīng)該再加X(jué)卻減了X犀概。

因此,需要對(duì)上面的代碼進(jìn)行修改夜惭。

    public int romanToInt(String s) {
        int number = mapping(s.charAt(s.length()-1));
        int right = number;
        for(int i=s.length()-2; i>=0; i--){
            int left = mapping(s.charAt(i));
            if(left < right) number -= left;
            else number += right;
            right = left;
        }
        return number;  
    }

加入了一個(gè)right變量姻灶,記錄右邊的數(shù)字,通過(guò)判斷左右兩個(gè)數(shù)的大小進(jìn)行增減操作诈茧。

他人的方法:

我是由右向左的产喉,跟右邊的數(shù)作比較,看了別人的代碼是由左向右的若皱,具體的比較方式分為跟左邊和右邊的數(shù)比較兩種方式镊叁。由此看來(lái),還有其他三種方法走触。

方法二:

    public int romanToInt(String s) {
        int number = 0;
        for(int i=s.length()-1; i>=0; i--){
            int n= mapping(s.charAt(i));
            if(i==0 || n <= mapping(s.charAt(i-1))) number += n;
            else number += n - 2*mapping(s.charAt(i-1));
        }
        return number;  
    }

從右往左晦譬,跟左邊數(shù)比較,如果小于等于左邊數(shù)互广,加上當(dāng)前數(shù)字敛腌;如果大于左邊數(shù),就加上當(dāng)前數(shù)字減去兩倍的左邊的數(shù)惫皱,用來(lái)抵消接下來(lái)多加上的左邊數(shù)像樊。

方法三:

    public int romanToInt(String s) {
        int number = 0;
        for(int i=0; i<s.length(); i++){
            int n= mapping(s.charAt(i));
            if(i==0 || n <= mapping(s.charAt(i-1))) number += n;
            else number += n - 2*mapping(s.charAt(i-1));
        }
        return number;  
    }

方法四:

    public int romanToInt(String s) {
        int number = 0;
        for(int i=0; i<s.length(); i++){
            int n= mapping(s.charAt(i));
            if(i==s.length()-1 || n >= mapping(s.charAt(i+1))) number += n;
            else number -= n;
        }
        return number;  
    }

方法三和方法四都是從左至右的,分別與左邊和右邊的數(shù)進(jìn)行比較旅敷。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末生棍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子媳谁,更是在濱河造成了極大的恐慌涂滴,老刑警劉巖友酱,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異柔纵,居然都是意外死亡缔杉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門搁料,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)或详,“玉大人,你說(shuō)我怎么就攤上這事郭计“郧伲” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵昭伸,是天一觀的道長(zhǎng)沈贝。 經(jīng)常有香客問(wèn)我,道長(zhǎng)勋乾,這世上最難降的妖魔是什么宋下? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮辑莫,結(jié)果婚禮上学歧,老公的妹妹穿的比我還像新娘。我一直安慰自己各吨,他們只是感情好枝笨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著揭蜒,像睡著了一般横浑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屉更,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天徙融,我揣著相機(jī)與錄音,去河邊找鬼瑰谜。 笑死欺冀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的萨脑。 我是一名探鬼主播隐轩,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼渤早!你這毒婦竟也來(lái)了职车?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悴灵,沒(méi)想到半個(gè)月后军援,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡称勋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涯竟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赡鲜。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖庐船,靈堂內(nèi)的尸體忽然破棺而出银酬,到底是詐尸還是另有隱情,我是刑警寧澤筐钟,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布揩瞪,位于F島的核電站,受9級(jí)特大地震影響篓冲,放射性物質(zhì)發(fā)生泄漏李破。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一壹将、第九天 我趴在偏房一處隱蔽的房頂上張望嗤攻。 院中可真熱鬧,春花似錦诽俯、人聲如沸妇菱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)闯团。三九已至,卻和暖如春仙粱,著一層夾襖步出監(jiān)牢的瞬間房交,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工伐割, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涌萤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓口猜,卻偏偏與公主長(zhǎng)得像负溪,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子济炎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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