##一般的循环解法
intromanToInt(string s){int result=0;
map<char,int> map={{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000}};//初始化哈希表for(int i=0;i<s.length();i++){if(map[s[i]]< map[s[i+1]])//如果该字符比后一个字符小,则减去该字符的数字
result -= map[s[i]];else{
result += map[s[i]];//否则加上该字符的数字}}return result;}
##采用递归解法
classSolution{public:intdigitsToVlaue(char ch){//可以用hash map优化掉for(int i =0; i <7; i++){if(digits[i]== ch)return values[i];}return0;}intmaxIndex(char* str,int L,int R){//获取最大字符int max =digitsToVlaue(str[L]);int maxIndex = L;for(int i = L; i <= R; i++){int m=digitsToVlaue(str[i]);if(m > max){
max = m;
maxIndex = i;}}return maxIndex;}intromanToNumber(char str[],int L,int R){if(L == R)returndigitsToVlaue(str[L]);if(L > R)return0;int mi =maxIndex(str,L,R);int max =digitsToVlaue(str[mi]);int left =romanToNumber(str, L, mi -1);//递归的算坐标的式子int right =romanToNumber(str, mi +1, R);//递归的算右边的式子return max - left + right;}private:char digits[7]={'I','V','X','L','C','D','M'};int values[7]={1,5,10,50,100,500,1000};};