题目:[leetcode]13. 罗马数字转整数
罗马数字和整数转换
/* 作者: rentingsong
* 思路:
* 1、使用map映射罗马数字对应的整数值
* 2、使用for循环,从字符串s的第一个字符开始,和右相邻的字符进行与逻辑判断,
* 如果符合特殊情况,按特殊情况处理,并使i加1,这样子是为了跳过下一个字符,因为计算过了嘛;
* 如果不符合特殊情况,直接加上这个字符对应的整数。
* 3、有一个难处理的是,当i=s.length()-1时,如果再和下一位比较,会出现越位,所以让i < s.length() - 1,
* 来处理不越位的情况,最后一位单独处理。处理方法是设置一个标志位flag,
* 如果flag=0,表示最后两位是特殊情况,直接返回结果res;
* 如果flag=1,表示最后两位是正常情况,需要加上最后一位,然后返回结果res。
*/
#include<iostream>
#include<map>
using namespace std;
class Solution {
public:
int romanToInt(string s) { // 字符映射整数
map<char, int> letterToInt;
letterToInt['I'] = 1;
letterToInt['V'] = 5;
letterToInt['X'] = 10;
letterToInt['L'] = 50;
letterToInt['C'] = 100;
letterToInt['D'] = 500;
letterToInt['M'] = 1000;
int res = 0;
bool flag = 0; // 设立标志位,单独处理最后一位,0:特殊情况 1:正常情况
for(int i = 0; i < s.length(); i++) {
if (i < s.length() - 1) { // 用条件控制不越位的情况,最后两位是特殊情况会在这个条件下处理
if ( i == s.length() - 2) { // 如果是倒数第二位,设立标志位为1,默认为最后两位是正常情况
flag = 1;
}
if (s[i] == 'I' && s[i + 1] == 'V') {
res = res + 4;
i = i + 1;
flag = 0; //特殊情况置为0
continue;
} else if (s[i] == 'I' && s[i + 1] == 'X') {
res = res + 9;
i = i + 1;
flag = 0; //特殊情况置为0
continue;
} else if (s[i] == 'X' && s[i + 1] == 'L') {
res = res + 40;
i = i + 1;
flag = 0; //特殊情况置为0
continue;
} else if (s[i] == 'X' && s[i + 1] == 'C') {
res = res + 90;
i = i + 1;
flag = 0; //特殊情况置为0
continue;
} else if (s[i] == 'C' && s[i + 1] == 'D') {
res = res + 400;
i = i + 1;
flag = 0; //特殊情况置为0
continue;
} else if (s[i] == 'C' && s[i + 1] == 'M') {
res = res + 900;
i = i + 1;
flag = 0; //特殊情况置为0
continue;
} else {
res = res + letterToInt[s[i]];
flag = 1; //正常情况置为1
continue;
}
}
if (flag = 1){ // 根据flag判断最后一位如果是正常情况,res加上最后一位
res = res + letterToInt[s[s.length() - 1]];
}
}
return res;
}
};
来源:CSDN
作者:tingsong_diary
链接:https://blog.csdn.net/qq_37871657/article/details/103644503