65 lines
1.7 KiB
C++
65 lines
1.7 KiB
C++
#include <string>
|
|
#include <map>
|
|
|
|
typedef std::map<std::string, unsigned long> RomanNumeral;
|
|
|
|
class RomanToIntegerSolution {
|
|
|
|
private:
|
|
RomanNumeral numTable;
|
|
|
|
public:
|
|
int romanToInt(std::string s) {
|
|
|
|
unsigned long roman(0);
|
|
std::string remainder;
|
|
remainder.resize(s.length());
|
|
|
|
unsigned long singleRomanNumerals[255];
|
|
|
|
singleRomanNumerals['I'] = 1;
|
|
singleRomanNumerals['V'] = 5;
|
|
singleRomanNumerals['X'] = 10;
|
|
singleRomanNumerals['L'] = 50;
|
|
singleRomanNumerals['C'] = 100;
|
|
singleRomanNumerals['D'] = 500;
|
|
singleRomanNumerals['M'] = 1000;
|
|
|
|
numTable["IV"] = 4;
|
|
numTable["IX"] = 9;
|
|
numTable["XL"] = 40;
|
|
numTable["XC"] = 90;
|
|
numTable["CD"] = 400;
|
|
numTable["CM"] = 900;
|
|
|
|
auto len(s.length());
|
|
unsigned long j(0);
|
|
unsigned long i = 0;
|
|
|
|
for ( ; i < len-1; i++ ) {
|
|
char str[3];
|
|
str[0] = s[i];
|
|
str[1] = s[i+1];
|
|
str[2] = 0;
|
|
|
|
auto it(numTable.find(str));
|
|
if (it != numTable.end()) {
|
|
roman += it->second;
|
|
i++;
|
|
} else {
|
|
remainder[j++] = s[i];
|
|
remainder[j] = 0;
|
|
}
|
|
}
|
|
if ( i < len ) {
|
|
remainder[j++] = s[i];
|
|
remainder[j] = 0;
|
|
}
|
|
for (i = 0; (i < remainder.length()) && (remainder[i] != 0); i++) {
|
|
roman += singleRomanNumerals[remainder[i]];
|
|
}
|
|
|
|
return roman;
|
|
}
|
|
};
|