[LeetCode][Python]13. Roman to Integer

Given a roman numeral, convert it to an integer.

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

思路:

  1. 首先找到Roman字母的規(guī)律
羅馬數(shù)字的表示:
I - 1
V - 5
X - 10
L - 50
C - 100
D - 500
M - 1000

羅馬數(shù)字采用七個羅馬字母作數(shù)字廉涕、即Ⅰ(1)泻云、X(10)、C(100)狐蜕、M(1000)宠纯、V(5)、L(50)层释、D(500)征椒。記數(shù)的方法:

  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瓢省;

思路:

  1. 將羅馬數(shù)字轉(zhuǎn)換成對應(yīng)的整數(shù)弄息。首先將羅馬數(shù)字翻轉(zhuǎn),從小的開始累加勤婚,如果遇到CM(M-C=1000-100=900)這種該怎么辦呢摹量?因為翻轉(zhuǎn)過來是MC,M=1000先被累加馒胆,所以使用一個last變量缨称,把M記錄下來,如果下一個數(shù)小于M祝迂,那么減兩次C睦尽,然后將C累加上
  2. 從右向左依次處理:當(dāng)遇到這個字母表示的數(shù)字比后一個小的時候,減去這個數(shù)型雳;否則当凡,累加。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
class Solution(object):
    def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """
        d = {'I':1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
        s = s[::-1]
        sum = 0
        last = None
        for e in s:
            if last and d[e] < last:
                sum -= 2*d[e]
            sum += d[e]
            last = d[e]
        return sum

    def romanToInt2(self, s):
        d = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
        sum = 0

        for i in xrange(len(s)-1, -1, -1):
            if (i <len(s)-1) and (d[s[i]] < d[s[i+1]]):
                sum -= d[s[i]]
            else:
                sum += d[s[i]]
        return sum


if __name__ == '__main__':
    sol = Solution()
    s1 = "MCMLXXX"
    print sol.romanToInt(s1)
    print sol.romanToInt2(s1)

    s2 = "DCXXI"
    print sol.romanToInt(s2)
    print sol.romanToInt2(s2)

    s3 = "XIX"
    print sol.romanToInt(s3)
    print sol.romanToInt2(s3)

    s3 = "CDMX"
    print sol.romanToInt(s3)
    print sol.romanToInt2(s3)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纠俭,一起剝皮案震驚了整個濱河市沿量,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柑晒,老刑警劉巖欧瘪,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眷射,死亡現(xiàn)場離奇詭異匙赞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)妖碉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門涌庭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人欧宜,你說我怎么就攤上這事坐榆。” “怎么了冗茸?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵席镀,是天一觀的道長。 經(jīng)常有香客問我夏漱,道長豪诲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任挂绰,我火速辦了婚禮屎篱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己交播,他們只是感情好重虑,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秦士,像睡著了一般缺厉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伍宦,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天芽死,我揣著相機(jī)與錄音,去河邊找鬼次洼。 笑死关贵,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卖毁。 我是一名探鬼主播揖曾,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼亥啦!你這毒婦竟也來了炭剪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤翔脱,失蹤者是張志新(化名)和其女友劉穎奴拦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體届吁,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡错妖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了疚沐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片暂氯。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖亮蛔,靈堂內(nèi)的尸體忽然破棺而出痴施,到底是詐尸還是另有隱情,我是刑警寧澤究流,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布辣吃,位于F島的核電站,受9級特大地震影響芬探,放射性物質(zhì)發(fā)生泄漏神得。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一灯节、第九天 我趴在偏房一處隱蔽的房頂上張望循头。 院中可真熱鬧绵估,春花似錦、人聲如沸卡骂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽全跨。三九已至缝左,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浓若,已是汗流浹背渺杉。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留挪钓,地道東北人是越。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像碌上,于是被迫代替她去往敵國和親倚评。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

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