我是代码小白一个,但是本科传统机械专业,研究生是车联网,需要学习C++,但是也需要转行,所以学习完基础开始刷题力扣,很多不懂的地方也是站在前辈的肩上学习,先自己思考编写在VS上,然后实现不了再看别人的文章,可能别人没法注解全部的语句,那我为大家解惑就一个个进行注解方便阅读,可能有些人读不懂我写的,欢迎留言。
进行分析思考:
①第一反应是将相应的罗马文字存放在map容器中,用其作为key值来索引相应的整数值。
②第二反应是需要用前一个力扣题那样存放6个特例的情况进行相应的if判断吗?
③第三反应是输入的罗马字符串到底是放在哪个容器中,是map还是string,因为一开始想的是用substr指令来分割存放的罗马字符检索对应整数。
④第四反应是需要检索所输入罗马字符的个数吗?毕竟是一个累加求和的一个过程。
⑤第五反应是看过相应的解题提示后,明白需要注重对于输入的罗马字的一个判断,就是一般是左边的代表数是大于右边的,这边就凸显了之前第二反应的对于六个特例的判断。
#include
using namespace std;
#include<unordered_map>
#include
#include
int main()
{
map<string, int> m; //也可用map容器 尽管会根据关键值进行自动排序 或者无序的unordered_map
string s;
cout << "请输入您需要转化的罗马字符串" << endl;
cin >> s; //手动输入罗马字符串
m.insert(make_pair("I", 1)); //将标准罗马字符与相应的值放入无序map容器中进行储存
m.insert(make_pair("V", 5));
m.insert(make_pair("X", 10));
m.insert(make_pair("L", 50));
m.insert(make_pair("C", 100));
m.insert(make_pair("D", 500));
m.insert(make_pair("M", 1000));
int firstnum = m[s.substr(0, 1)];
int tempnum = firstnum; //创建暂存的罗马字符的代表数字
int sum = 0; //创建累加求和的罗马字符的代表数字器
for (int i = 1; i < s.size(); i++)
{
int prenum = m[s.substr(i, 1)]; //开始遍历输入的罗马字符,逐个比较
if (prenum > tempnum) //一般是左边的罗马字符代表的数字大于右边 现在比较判断的是第二个数右边大于第一个数左边
{
sum -= tempnum; //如果是右边比左边的大 那么先累加左边的负值 六个特例情况的代表数字规律
}
else
{
sum += tempnum;
}
tempnum = prenum; //将第二个罗马字符改为暂存 与第三个(接下来的)比较 不断更新比较的罗马字符代表的数字
}
sum += tempnum; //在for循环中 首先先加的都是罗马字符代表的数字比较中的第一个
cout << "您所转化的罗马字符串的整数是为: " << endl;
cout << sum << endl;
system("pause");
return 0;
}
以上为自己在VS中所编写的,如果在力扣中上交需要修改一些定义即可。