【每日一题】13. 罗马数字转整数
13. 罗马数字转整数 - 力扣(LeetCode) 题目难度:简单
罗马数字包含以下七种字符:
I
,V
,X
,L
,C
,D
和M
。字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000例如, 罗马数字
2
写做II
,即为两个并列的 1 。12
写做XII
,即为X
+II
。27
写做XXVII
, 即为XX
+V
+II
。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做
IIII
,而是IV
。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为IX
。这个特殊的规则只适用于以下六种情况:
I
可以放在V
(5) 和X
(10) 的左边,来表示 4 和 9。X
可以放在L
(50) 和C
(100) 的左边,来表示 40 和 90。C
可以放在D
(500) 和M
(1000) 的左边,来表示 400 和 900。给定一个罗马数字,将其转换成整数。
示例 1:
输入: s = "III" 输出: 3示例 2:
输入: s = "IV" 输出: 4示例 3:
输入: s = "IX" 输出: 9示例 4:
输入: s = "LVIII" 输出: 58 解释: L = 50, V= 5, III = 3.示例 5:
输入: s = "MCMXCIV" 输出: 1994 解释: M = 1000, CM = 900, XC = 90, IV = 4.
这也是一道简单题,一开始恢复性训练就慢慢来吧,之后有遇到一些深入的算法做完题在慢慢总结,大家有更好的解法也可以在评论区提出,博主有空的话会去看并且总结出来。
解题代码:
class Solution {
public int romanToInt(String s) {
int ans = 0;
int len = s.length();
int tmp;
StringBuffer sb = new StringBuffer(s);
for(int i = 0; i < len ; ++i) {
if(i < len-1) tmp = process(sb.charAt(i),sb.charAt(i+1));
else tmp = process(sb.charAt(i),'A');
ans+=tmp;
}
return ans;
}
public int process(char a,char b) {
if(a == 'I') {
if(b == 'V') return -1;
else if(b == 'X') return -1;
else return 1;
} else if(a == 'V') return 5;
else if(a == 'X') {
if(b == 'L') return -10;
else if(b == 'C') return -10;
else return 10;
} else if(a == 'L') return 50;
else if(a == 'C') {
if(b == 'D') return -100;
else if(b == 'M') return -100;
else return 100;
} else if(a == 'D') return 500;
else return 1000;
}
}
这里博主是另外写了一个方法,简单地将题目提示的所有情况进行一个模拟。在主方法中,每次使用两个字符去判断这个字符的值。分析题目可以发现,如果代表比较小数值的符号放在比较大数值符号的左边,那么它的值就会变成负数,根据这个特性,就可以判断出每个字符的数值,之后将每个数值的字符相加即可。
主方法中使用一个ans作为答案返回,tmp作为存储调用方法返回的数值,当然也可以直接使用ans+=方法,就无需用到tmp。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了