LeetCode [Roman to Integer]

本文详细介绍了一种将罗马数字转换为整数的算法,特别关注了4和9的特殊表示,提出了一种通过比较相邻字符值并进行相应加减运算的解决方案。文章提供了C和C++的实现代码,适合对算法和编程感兴趣的读者。

Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.

Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
For example, two is written as II in Roman numeral, just two one’s added together. Twelve is written as, XII, which is simply X + II. The number twenty seven is written as XXVII, which is XX + V + II.

Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:

I can be placed before V (5) and X (10) to make 4 and 9.
X can be placed before L (50) and C (100) to make 40 and 90.
C can be placed before D (500) and M (1000) to make 400 and 900.
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.

Example 1:

Input: “III”
Output: 3
Example 2:

Input: “IV”
Output: 4
Example 3:

Input: “IX”
Output: 9
Example 4:

Input: “LVIII”
Output: 58
Explanation: L = 50, V= 5, III = 3.
Example 5:

Input: “MCMXCIV”
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

**问题解析:**大概的题意就是给出罗马数字让翻译成阿拉伯数字,重点是4, 9的表示不符合常规,我们需要特殊“照顾"
**思路:**我们可以设一个ans来记录罗马数对应的阿拉伯数值(初值为0),从字符最后一个遍历,如果第i个字符比它前一个字符大,则ans加上第i个字符对应的数值减去它前一个字符对应的数值,否则就加上本身。例如MCMXCIV,V比I大,则ans+=5-1(4)。C比X大,则ans+=100-10(94).以此类推。
C语言代码如下:

#include<cstdio>
#include<cmath>
#include<map>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	char str[20];
	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;
	cin >> str;
	int n=strlen(str);
	int ans=0;
	for(int i = n-1;i>=0;i--)	
	{
		if(i==0)
		{
			ans+=mp[str[i]];
			break;
		}
		else
		{
				if(mp[str[i]]>mp[str[i-1]])
			{
				ans+=mp[str[i]]-mp[str[i-1]];
				i--;
			}
			else
			{
				ans+=mp[str[i]];
			}
		}
		
		
	}
	cout<<ans;


 return 0;
}

LeetCode里由于C不能用map函数,因此用C+++提交,代码如下:

class Solution {
public:
    int romanToInt(string s) {
        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 ans=0;
        for(int i = s.size();i>=0;i--)	
        {
            if(i==0)
            {
                ans+=mp[s[i]];
                break;
            }
            else
            {
                    if(mp[s[i]]>mp[s[i-1]])
                {
                    ans+=mp[s[i]]-mp[s[i-1]];
                    i--;
                }
                else
                {
                    ans+=mp[s[i]];
                }
            }


        }
        return ans;
        
    }
};

大家可以看一下C++中string的用法:标准C++中的string类的用法总结
不熟悉map函数的童鞋可以去搜一下,这里不再多讲,附上一个map函数的简单应用map函数统计字符个数

【SCI复现】含可再生能源与储能的区域微电网最优运行:应对不确定性的解鲁棒性与非预见性研究(Matlab代码实现)内容概要:本文围绕含可再生能源与储能的区域微电网最优运行展开研究,重点探讨应对不确定性的解鲁棒性与非预见性策略,通过Matlab代码实现SCI论文复现。研究涵盖多阶段鲁棒调度模型、机会约束规划、需求响应机制及储能系统优化配置,结合风电、光伏等可再生能源出力的不确定性建模,提出兼顾系统经济性与鲁棒性的优化运行方案。文中详细展示了模型构建、算法设计(如C&CG算法、大M法)及仿真验证全过程,适用于微电网能量管理、电力系统优化调度等领域的科研与工程实践。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及从事微电网、能源管理相关工作的工程技术人员。; 使用场景及目标:①复现SCI级微电网鲁棒优化研究成果,掌握应对风光负荷不确定性的建模与求解方法;②深入理解两阶段鲁棒优化、分布鲁棒优化、机会约束规划等先进优化方法在能源系统中的实际应用;③为撰写高水平学术论文或开展相关课题研究提供代码参考和技术支持。; 阅读建议:建议读者结合文档提供的Matlab代码逐模块学习,重点关注不确定性建模、鲁棒优化模型构建与求解流程,并尝试在不同场景下调试与扩展代码,以深化对微电网优化运行机制的理解。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值