非常简单的道题目,当作重温算法的第一碟小记录下。过程中其实也重新回忆下CPP语法
#include <string>
#include <list>
#include <iostream>
using namespace std;
unsigned char2int(char v)
{
switch (v)
{
case 'I':return 1; break;
case 'V':return 5; break;
case 'X':return 10; break;
case 'L':return 50; break;
case 'C':return 100; break;
case 'D':return 500; break;
case 'M':return 1000; break;
default: return 0; break;
}
}
unsigned has_prev(char cur, char prev)
{
switch (cur)
{
case 'V':if(prev == 'I') return 4; break;// IV = 4
case 'X':if(prev == 'I') return 9; break;// IX = 9
case 'L':if(prev == 'X') return 40; break;// XL = 40
case 'C':if (prev == 'X') return 90; break;;// XC = 90
case 'D':if (prev == 'C') return 400; break;// CD = 400
case 'M':if (prev == 'C') return 900; break;// CM = 900
default:break;
}
return 0;
};
class Solution {
public:
int romanToInt(string s) {
int value = 0;
size_t len = s.length();
//cout << len << endl;
int i = 0;
while(i++ < len){
char cur = s[len - i];
int prev_idx = len - i - 1;
if (prev_idx >= 0){
int append = has_prev(cur, s[prev_idx]);
if (append > 0) {
i++;
value += append;
}else {
value += char2int(cur);
}
}else{
value += char2int(cur);
}
}
//cout << s << " to " << value << endl;
return value;
}
};
int main()
{
Solution a;
list<string> tests = { "LVIII", "IX", "MCMXCIV", "IV", "III"};
for (list<string>::iterator itr = tests.begin(); itr != tests.end(); ++itr) {
//std::cout << ' ' << *itr;
int value = a.romanToInt(*itr);
cout << *itr << " to " << value << endl;
}
system("pause");
return 0;
评论 (0)