目录
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);