LeetCode每日一題抵赢,羅馬數(shù)字轉(zhuǎn)整數(shù)

題目

羅馬數(shù)字轉(zhuǎn)整數(shù)

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

公眾號 《java編程手記》記錄JAVA學(xué)習(xí)日常欺劳,分享學(xué)習(xí)路上點點滴滴,從入門到放棄铅鲤,歡迎關(guān)注

描述

難度:簡單

羅馬數(shù)字包含以下七種字符: I划提, V, X邢享, L鹏往,C,D 和 M骇塘。

字符          數(shù)值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如伊履, 羅馬數(shù)字 2 寫做 II ,即為兩個并列的 1款违。12 寫做 XII 唐瀑,即為 X + II27 寫做 XXVII, 即為 XX + V + II 插爹。

通常情況下哄辣,羅馬數(shù)字中小的數(shù)字在大的數(shù)字的右邊。但也存在特例赠尾,例如 4 不寫做 IIII力穗,而是 IV。數(shù)字 1 在數(shù)字 5 的左邊气嫁,所表示的數(shù)等于大數(shù) 5 減小數(shù) 1 得到的數(shù)值 4 当窗。同樣地,數(shù)字 9 表示為 IX杉编。這個特殊的規(guī)則只適用于以下種情況:

  • I 可以放在 V (5)X (10) 的左邊超全,來表示 49咆霜。
  • X 可以放在 L (50)C (100) 的左邊,來表示 4090嘶朱。
  • C 可以放在 D (500)M (1000) 的左邊蛾坯,來表示 400900
  • 給定一個羅馬數(shù)字疏遏,將其轉(zhuǎn)換成整數(shù)脉课。輸入確保在 13999 的范圍內(nèi)。

示例 1:

輸入: "III"
輸出: 3

示例 2:

輸入: "IV"
輸出: 4

示例 3:

輸入: "IX"
輸出: 9

示例 4:

輸入: "LVIII"
輸出: 58
解釋: L = 50, V= 5, III = 3.

示例 5:

輸入: "MCMXCIV"
輸出: 1994
解釋: M = 1000, CM = 900, XC = 90, IV = 4.

提示:

1 <= s.length <= 15
s 僅含字符 ('I', 'V', 'X', 'L', 'C', 'D', 'M')
題目數(shù)據(jù)保證 s 是一個有效的羅馬數(shù)字财异,且表示整數(shù)在范圍 [1, 3999] 內(nèi)
題目所給測試用例皆符合羅馬數(shù)字書寫規(guī)則倘零,不會出現(xiàn)跨位等情況。
IL 和 IM 這樣的例子并不符合題目要求戳寸,49 應(yīng)該寫作 XLIX呈驶,999 應(yīng)該寫作 CMXCIX 。
關(guān)于羅馬數(shù)字的詳盡書寫規(guī)則疫鹊,可以參考 羅馬數(shù)字 - Mathematics 袖瞻。

Solution

正常解法

解題思路

整理出所有的對應(yīng)關(guān)系

昨天做的整數(shù)到羅馬,今天兩級反轉(zhuǎn)拆吆,羅馬到整數(shù)聋迎,思路本質(zhì)是一樣的,找對應(yīng)映射轉(zhuǎn)換關(guān)系枣耀,特殊點就在于 IV IX XL XC這類表示先減后加的邏輯

image-20210420221849374
  • 首先找到對應(yīng)羅馬字符的整數(shù)及其對應(yīng)的前一個羅馬字符對應(yīng)的整數(shù)霉晕,注意這里是羅馬字符對應(yīng)轉(zhuǎn)換的整數(shù)
  • 這里可以用getValue抽象獲取羅馬字符對應(yīng)的整數(shù)
  • 我們的整體思路是在i的迭代遍歷中計算i-1的數(shù)據(jù),然后在最后加上i的值
    • 判斷前一個整數(shù)當(dāng)前整數(shù)的值捞奕,
      • 如果前一個整數(shù) 小于 當(dāng)前整數(shù)的值牺堰,說明是特殊情況,需要先減去對應(yīng)的前一個的數(shù)值
      • 其他情況則正常加上前一個整數(shù)的值
    • 在最后加上I的值

CODE

class Solution {
    public int romanToInt(String s) {
        int len =  s.length();
        int sum = 0;
        int preNum = getValue(s.charAt(0));
        for(int i = 1 ; i<len ; i++){
            char c = s.charAt(i);
            int num= getValue(c);
            //在i的迭代計算i-1的值
            if(preNum < num){
                //特殊情況缝彬,先減去值,比如針對 IV = 4 萌焰,這里就是 -1(I)
                sum -= preNum;
            }else{
                //正常加上值     針對 IV = 4 哺眯,這里就是 +5(V)
                sum += preNum;
            }
            // 將當(dāng)前i賦值給i+1谷浅,在下一個迭代中計算
            preNum = num;
        }
                //在最后加上I的值
        sum +=preNum;
        return sum;

    }
    private int getValue(char ch) {
        switch(ch) {
            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;
        }
    }

}

復(fù)雜度

  • 時間復(fù)雜度 O(N), N為羅馬字符的長度

結(jié)果

  • 執(zhí)行用時:4 ms, 在所有 Java 提交中擊敗了100.00%的用戶
  • 內(nèi)存消耗:38.5 MB, 在所有 Java 提交中擊敗了72.23%的用戶

LeetCode名句

這題屬于簡單嗎?奶卓?一疯?

?著作權(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
  • 文/潘曉璐 我一進店門慕蔚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斋配,你說我怎么就攤上這事孔飒。” “怎么了艰争?”我有些...
    開封第一講書人閱讀 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)容