題目鏈接:13. 羅馬數字轉整數 - 力扣(LeetCode)
普通版本(模擬)
分析:通常情況下,羅馬數字中小的數字在大的數字的右邊。若輸入的字符串滿足該情況,累加每個字符對應的數值即可(XXVII 可視作 X+X+V+I+I=10+10+5+1+1=27);若存在小的數字在大的數字的左邊的情況,根據規則需要減去小的數字(XIV 可視作 X?I+V=10?1+5=14)
結論:當前位置表示的元素的值?< 下個位置表示的元素的值,就用總數減去當前位置的值(小的在左),否則總數加上當前位置的值(小的在右)
class Solution {
private:unordered_map<char, int> symbolValues = {{'I', 1},{'V', 5},{'X', 10},{'L', 50},{'C', 100},{'D', 500},{'M', 1000},};public:int romanToInt(string s) {int ans = 0;//最終結果int n = s.length();for (int i = 0; i < n; ++i) {int value = symbolValues[s[i]];//value表示當前位置上的字符,[]返回值是鍵對應的值的引用if (i < n - 1 && value < symbolValues[s[i + 1]])//前一個字符和后一個字符進行比較,因此i表示的位置不能是n-1{ans -= value;//當前位置的元素比下個位置的元素小,就減去當前值,否則加上當前值}else {ans += value;}}return ans;}
};
時間復雜度:O(N)
空間復雜度:O(1)?
注意事項:記得查看unordered_map的使用方式,[]的傳入值與返回值,unordered_map的初始化及插入方式C++的map和set-CSDN博客
~over~