Problem: 13. 罗马数字转整数
思路
从后往前循环每个字符,给每一个罗马数字按照代表的大小赋值,如果本次字符串对应的值是小于后面的则加上对应的大小,如果大就减去对应的字符,如果本身就是最后一个则只加上该大小即可
解题方法
因为switch语法需要语句不超过一个,所以采用if的嵌套更方便,以及加入数组存放每个字符对应的值,注意i不能超过n-1以及大于0即可
复杂度
时间复杂度:
O ( n ) O(n) O(n)
空间复杂度:
O ( n ) O(n) O(n)
Code
class Solution {
public:
int romanToInt(string s) {
int n = s.size();
int sum=0,a[n],I=1,V=5,X=10,L=50,C=100,D=500,M=1000;
for(int i = n-1;i>=0;i--){
if(s[i]=='I'){
a[i]=1;
if(i!=n-1&&a[i]>=a[i+1])sum+=I;
else if(i!=n-1&&a[i]<a[i+1])sum-=I;
else sum+=I;
}
if(s[i]=='V'){
a[i]=2;
if(i!=n-1&&a[i]>=a[i+1])sum+=V;
else if(i!=n-1&&a[i]<a[i+1])sum-=V;
else sum+=V;
}
if(s[i]=='X'){
a[i]=3;
if(i!=n-1&&a[i]>=a[i+1])sum+=X;
else if(i!=n-1&&a[i]<a[i+1])sum-=X;
else sum+=X;
}
if(s[i]=='L'){
a[i]=4;
if(i!=n-1&&a[i]>=a[i+1])sum+=L;
else if(i!=n-1&&a[i]<a[i+1])sum-=L;
else sum+=L;
}
if(s[i]=='C'){
a[i]=5;
if(i!=n-1&&a[i]>=a[i+1])sum+=C;
else if(i!=n-1&&a[i]<a[i+1])sum-=C;
else sum+=C;
}
if(s[i]=='D'){
a[i]=6;
if(i!=n-1&&a[i]>=a[i+1])sum+=D;
else if(i!=n-1&&a[i]<a[i+1])sum-=D;
else sum+=D;
}
if(s[i]=='M'){
a[i]=7;
if(i!=n-1&&a[i]>=a[i+1])sum+=M;
else if(i!=n-1&&a[i]<a[i+1])sum-=M;
else sum+=M;
}
}
return sum;
}
};