C++/PY力扣:13.罗马数字整数

C++:

哈希表

代码思路:使用了哈希表(map)来存储罗马数字与整数的映射关系。

  1. 映射表: 使用 map 存储罗马数字与整数的对应关系,这里使用了 unordered_map 更合适,因为查找的时间复杂度是平均 O(1)。

  2. 循环迭代字符串: 从左到右遍历输入的罗马数字字符串,通过比较当前字符与下一个字符的值的大小,累加或累减相应的整数值。

向后遍历 

代码思路:实现的精髓在于从右向左遍历字符串,通过比较当前字符与前一个字符的大小关系,直接进行累加或累减操作。这样的实现在时间和空间复杂度上都是相对较优的。由于使用了 unordered_map,查找整数值的操作是平均 O(1) 的时间复杂度。

#include <iostream>
#include <string>
#include <map>
using namespace std;

class Solution {
public:
    int romanToInt(string s) {
        /*
        // 哈希表,时间:n,空间:1
        map<string, int> dict = {
            {"I", 1},
            {"V", 5},
            {"X", 10},
            {"L", 50},
            {"C", 100},
            {"D", 500},
            {"M", 1000}
        };
        int res = 0;

        for (int i = 0; i < s.size() - 1; i++) {
            if (dict.count(s.substr(i, 1)) && dict[s.substr(i, 1)] < dict[s.substr(i + 1, 1)]) {
                res -= dict[s.substr(i, 1)];
            } else if (dict.count(s.substr(i, 1))) {
                res += dict[s.substr(i, 1)];
            } else {
                return -1;  // 错误代码应该是整数类型
            }
        }

        // 处理最后一个字符
        if (dict.count(s.substr(s.size() - 1, 1))) {
            res += dict[s.substr(s.size() - 1, 1)];
        } else {
            return -1;  // 错误代码应该是整数类型
        }

        return res;
        */
        // 向后遍历,时间:n,空间:1
        unordered_map<char, int> dict = {
            {'I', 1},
            {'V', 5},
            {'X', 10},
            {'L', 50},
            {'C', 100},
            {'D', 500},
            {'M', 1000}
        };
        int res = 0, temp = 0;
        for (int i = s.length()-1; i >= 0; i--)
        {
            int value = dict[s[i]];
            value >= temp ? res += value : res -= value;
            temp = value;
        }
        return res;

    }
};

PY

class Solution:
    def romanToInt(self, s):
        dict = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
        res = 0
        for i in range(len(s)-1):
            if s[i] in dict and dict[s[i]] < dict[s[i+1]]:
                res -= dict[s[i]]
            elif(s[i] in dict):
                res += dict[s[i]]
            else:
                print("Error")

        return res + dict[s[-1]]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值