别人的思路借鉴:
用字典存储各个罗马数字代表的阿拉伯数字
按顺序读取罗马数字,当前数字小于下一个数字,则是下一个数字减去当前数字,否则直接相加
比如IV就是*-1+5=4*,而IIV这种情况是不存在的,对于其他量级的数字也是同理。
实际处理的时候最后一个数字无法和它下一个数字比较,因为不存在下一个数字。
但是最后一个数字永远是加的而不是减的,所以就单独拎出来处理就好。
class Solution {
public:
int romanToInt(string s) {
int sum = 0;
char c[] = { 'I','V','X','L','C','D','M' };
int q[] = { 1,5,10,50,100,500,1000 };
for (int i = 0; i < s.size(); i++)
{
int z1 = 0, z2 = 0;
switch (s[i])
{
case 'I':
z1 = q[0]; break;
case 'V':
z1 = q[1]; break;
case 'X':
z1 = q[2]; break;
case 'L':
z1 = q[3]; break;
case 'C':
z1 = q[4]; break;
case 'D':
z1 = q[5]; break;
case 'M':
z1 = q[6]; break;
}
switch (s[i + 1])
{
case 'I':
z2 = q[0]; break;
case 'V':
z2 = q[1]; break;
case 'X':
z2 = q[2]; break;
case 'L':
z2 = q[3]; break;
case 'C':
z2 = q[4]; break;
case 'D':
z2 = q[5]; break;
case 'M':
z2 = q[6]; break;
}
if (z1 < z2)
{
sum += -z1;
}
else
{
sum += z1;
}
z1 = 0;
z2 = 0;
}
return sum;
}
};
测试代码:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int romanToInt(string s)
{
int sum = 0;
char c[] = { 'I','V','X','L','C','D','M' };
int q[] = { 1,5,10,50,100,500,1000 };
for (int i = 0; i < s.size(); i++)
{
int z1 = 0, z2 = 0;
switch (s[i])
{
case 'I':
z1 = q[0];break;
case 'V':
z1 = q[1];break;
case 'X':
z1 = q[2];break;
case 'L':
z1 = q[3];break;
case 'C':
z1 = q[4];break;
case 'D':
z1 = q[5];break;
case 'M':
z1 = q[6];break;
}
switch (s[i+1])
{
case 'I':
z2 = q[0];break;
case 'V':
z2 = q[1];break;
case 'X':
z2 = q[2];break;
case 'L':
z2 = q[3];break;
case 'C':
z2 = q[4];break;
case 'D':
z2 = q[5];break;
case 'M':
z2 = q[6];break;
}
if (z1 < z2)
{
sum += - z1;
}
else
{
sum += z1;
}
z1 = 0;
z2 = 0;
}
return sum;
}
int main()
{
string s= "MCMXCIV";
int a = romanToInt(s);
while (1)
{
getchar();
}
return 0;
}