刷爆力扣!反超对象第四天(罗马数字转整数)

目录

1.题目解析

2.代码提交

3.知识点解析

3.1.构造函数

3.2.插入元素

3.3.常用函数


1.题目解析

题目:罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。

字符转整型数字,可以用哈希表或者map来做,比较好处理,通过value的相加就可以得到答案。

但是本题需要注意的是,4、9、40、90、400、900这几种特殊情况,也就是小数在大数前时,需要特殊处理。

在for循环里判断后一位的value大于当前位时,ans-=value,即可。

2.代码提交

class Solution {
public:
    int romanToInt(string s) {
        map<char,int> map;
        map['I'] = 1;
        map['V'] = 5;
        map['X'] = 10;
        map['L'] = 50;
        map['C'] = 100;
        map['D'] = 500;
        map['M'] = 1000;
        int ans=0;
        for(int i=0;i<s.size();i++)
        {
            int value = map[s[i]];
            if((i<s.size()-1) && (value<map[s[i+1]]))
            {
                ans -= value;
            }
            else
            {
                ans += value;
            }
        }
        return ans;
    }
};

最后完美通过,又是接近打败对象的一天!看了一下官方答案,用的是哈希表,想法差不多,那就不贴啦~

 

3.知识点解析

本次主要用到了map函数,之前总是会用到,但是没有系统学习,今天就在这里记录一下。

map是STL三大常用容器,map由红黑树实现,其元素都是“键值/实值”,所形成的一个key/value pair。每个元素都有一个键,是排序准则的基础。每个键只能出现一次,不允许重复

map主要用于一对一映射的情况,map内部自建一棵红黑树,这棵树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。

map容器本身就带了字典排序的功能,由于内部红黑树结构的存储,查找的时间复杂度位O(log2N)。map的内部实现默认使用key键的升序来排序map的值,利用iterator在遍历它时,是一种中序遍历。

3.1.构造函数

map<char, int> myMap;
map<int, string> myMap;  //整型映射到字符串时

3.2.插入元素

//第一种 用[]直接插入
myMap[a] = 30;

//第二种,用insert插入
//此类两个方法,因为pair等价于value_type
myMap.insert(pair<char,int>(a,30));
myMap.insert(make_pair(a,30));
myMap.insert(map<char,int>::value_type(a,30));

3.3.常用函数

成员函数功能
begin()返回指向map头部的迭代器
clear()删除所有元素
count()返回指定元素出现的次数
empty()如果map为空则返回true
end()返回指向map末尾的迭代器
erase()删除一个元素
find()查找一个元素
insert()插入元素
key_comp()返回比较元素key的函数
max_size()返回可以容纳的最大元素个数
rbegin()返回一个指向map尾部的逆向迭代器
rend()返回一个指向map头部的逆向迭代器
size()返回map中元素的个数
swap()交换两个map
operator[]map容器重载[ ]运算符,只要知道map容器中某个键值对的键的值,就可以通过键直接获取对应的值
at(key)找到map容器中key键对应的值,如果找不到,引发out_of_rang异常

3.3.1.find()函数

map<char,int>::iterator it;
it = myMap.find("a");
if(it == myMap.end())
    cout<<"not find a"<<endl;
else
    cout<<"find a"<<endl;

3.3.2.erase()函数

map<char,int>::iterator it;
it = myMap.find("a");
if(it == myMap.end())
    cout<<"not find a"<<endl;
else
    myMap.erase(it);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在VS Code上力扣LeetCode)题目,首先需要进行以下几步操作: 1. 安装VS Code插件:在VS Code中搜索并安装LeetCode插件。这个插件可以提供LeetCode题目的在线编写和提交功能,以及自动测试和调试代码的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【史上最强代码编辑器VS Code】之VS Code力扣LeetCode)题目](https://blog.csdn.net/weixin_44553006/article/details/105183522)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [在 vscode 上力扣 Leetcode 可以这样来](https://blog.csdn.net/u012190388/article/details/121277555)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [leetcode答案-algo-study:从零开始力扣(LeetCode),JavaScript语言,算法](https://download.csdn.net/download/weixin_38680764/19920528)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值