Roman to Integer - LeetCode
题目链接
注意点
- 大的数字在小的数字左边是正常情况,要考虑的是小的数字在大的数字右边的那8种情况
解法
解法一:从右至左,对于出现的每个字符逐个判断,累加。时间复杂度为O(n)
class Solution {
public:
int romanToInt(string s) {
int i,n = s.size(),anw = 0;
for(i = n-1;i >= 0;i--)
{
if(s[i] == 'M')
{
if(s[i-1] == 'C')
{
anw += 900;
i--;
}
else
{
anw += 1000;
}
}
else if(s[i] == 'D')
{
if(s[i-1] == 'C')
{
anw += 400;
i--;
}
else
{
anw += 500;
}
}
else if(s[i] == 'C')
{
if(s[i-1] == 'X')
{
anw += 90;
i--;
}
else
{
anw += 100;
}
}
else if(s[i] == 'L')
{
if(s[i-1] == 'X')
{
anw += 40;
i--;
}
else
{
anw += 50;
}
}
else if(s[i] == 'X')
{
if(s[i-1] == 'I')
{
anw += 9;
i--;
}
else
{
anw += 10;
}
}
else if(s[i] == 'V')
{
if(s[i-1] == 'I')
{
anw += 4;
i--;
}
else
{
anw += 5;
}
}
else if(s[i] == 'I')
{
anw += 1;
}
//printf("%d\n",anw);
}
return anw;
}
};
解法二:从左至右。如果之前的数字小于当前的就减去之前的数字,否则就加上。最后一个字符无论如何都加上。时间复杂度O(n)
class Solution {
public:
int romanToInt(string s) {
map<char,int> m;
m['I'] = 1;
m['V'] = 5;
m['X'] = 10;
m['L'] = 50;
m['C'] = 100;
m['D'] = 500;
m['M'] = 1000;
int i,n = s.size(),anw = 0;
int before = m[s[0]],now = 0;
for(i = 1;i < n;i++)
{
now = m[s[i]];
if(before < now)
{
anw -= before;
}
else
{
anw += before;
}
before = now;
}
anw += before;
return anw;
}
};
小结
- 理解了罗马数字的原理这题就不难
分类:
LeetCode
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具