LeetCode系列之【12/13.罗马字符转整数(或相反)】C++ 经验总结

本文详细介绍了使用C++实现罗马数字到整数转换的过程,包括使用unordered_map存储罗马数字与整数的映射,通过遍历字符串并比较相邻罗马数字大小进行累加。文章还强调了特例判断的重要性,并提供了完整的代码实现,帮助初学者理解算法思路。
摘要由CSDN通过智能技术生成
    我是代码小白一个,但是本科传统机械专业,研究生是车联网,需要学习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中所编写的,如果在力扣中上交需要修改一些定义即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值