1. 程式人生 > >LeetCode 13.羅馬數字轉整數

LeetCode 13.羅馬數字轉整數

目錄

0. 題目描述

1. 解題分析

 (1)思路也很簡單:逐一讀取字串,根據轉換規則進行轉換。為了減少if邏輯判斷,用了map來儲存羅馬數字與對應的整數,增加了一點空間消耗。

#include<string>
#include<map>

static auto _=[]() //提升io效能
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    return 0;
}();

class Solution {
public:
    int romanToInt(string s) {
        string roman[] = { "I", "V", "X", "L", "C", "D", "M",
                           "IV", "IX", "XL", "XC", "CD", "CM"};
        int number[] = { 1, 5, 10, 50, 100, 500, 1000,
                         4, 9, 40, 90, 400, 900};
        map<string, int> dictionary;

        for (int i = 0; i < 13; i++) {
            dictionary.insert(pair<string, int>(roman[i], number[i]));
        }

        int intNum = 0;
        int length = s.length();
        for (int i = 0; i < length; i++) {
            if (i != length - 1) {
                string temp = s.substr(i, 2);
                if (temp == "IV" || temp == "IX" ||
                    temp == "XL" || temp == "XC" ||
                    temp == "CD" || temp == "CM") {
                    intNum += dictionary[s.substr(i, 2)];
                    i++;
                }
                else {
                    intNum += dictionary[s.substr(i, 1)];
                }
            }
            else {
                intNum += dictionary[s.substr(i, 1)];
            }

        }
        return intNum;
    }
};

複雜度分析

  • 時間複雜度:O(n)。
  • 空間複雜度:O(1)。

    測試用時56ms,優於81%左右的提交。而直接多層的if判斷,測試用時44ms,優於96%左右的提交。

    結果表明跟直接寫多層的if判斷比起來,反而更增加了時間空間消耗= =。可以說是費力不討好了……唯一優點是程式碼簡潔易讀。