给定一个罗马数字,将其转换成整数;
知识点
操作字符串;使用哈希表;
哈希表:哈希表存储的是由键(key)和值(value)组 成的数据。例如,我们将每个人的性别作为数 据进行存储,键为人名,值为对应的性别。
解题思路
哈希表法:将字母及其组合代表数值存入哈希表中,循环取出字符,寻找对应的数相加;
若是遇到特殊规则的组合,前一个字符设置为减,后一个字符正常计算;
具体步骤: 创建哈希表;
从字符串依次先取出两个字符和第二个字符比较,到底是取;两个字符还是一个字符;
最后相加一起;
class Solution {
public:
int romanToInt(string s) {
// 定义一个哈希表,键为字符,数字为值;
unordered_map<string, int> M = {{"I", 1}, {"IV", 4}, {"IX", 9}, {"V", 5}, {"X", 10}, {"XL", 40}, {"XC", 90}, {"L", 50}, {"C", 100}, {"CD", 400}, {"CM", 900}, {"D", 500}, {"M", 1000}};
int i=0;// 定义循环变量
int ans= 0; //
string two,one;
// 判断是为两个字符还是一个字符
for(i=0;i<s.size();){
two=s.substr(i,2); //从字符串s中下标为i开始去除2个值
one=s.substr(i,1);
if(M[two]){
ans=ans+M[two];
i=i+2;
}
else{
ans=ans+M[one];
i=i+1;
}
}
return ans;
}
};
直接单字符比较法:依次循环取出一个字符,判断是否比后面的大;若大则加上该字符,反之,减去该字符对应的值;
class Solution {
public:
int romanToInt(string s) {
unordered_map<char, int> mp;
mp['I'] = 1;
mp['V'] = 5;
mp['X'] = 10;
mp['L'] = 50;
mp['C'] = 100;
mp['D'] = 500;
mp['M'] = 1000;
int pos = 0, neg = 0;
for (int i = 0;i < s.size()-1;++i){
if (mp[s[i]] < mp[s[i+1]])
neg -= mp[s[i]];
else
pos += mp[s[i]];
}
pos += mp[s.back()];
return pos + neg;
}
};
直接看透罗马字符运算的本质
小结
学习新东西,刚开始一定很难,但请坚持,不要放弃,认真,坚持下去,找到学成功的自信心和满足感