13. 罗马数字转整数
1.直接模拟
-
本体比较简单,可以根据输入直接模拟;
-
class Solution { public: int romanToInt(string s) { int result=0; for(int i=0;i<s.size();i++){ if(s[i]=='I'){ if(i+1<s.size()&&s[i+1]=='V'){result+=4;i++;} else if(i+1<s.size()&&s[i+1]=='X'){result+=9;i++;} else{result+=1;} }else if(s[i]=='X'){ if(i+1<s.size()&&s[i+1]=='L'){result+=40;i++;} else if(i+1<s.size()&&s[i+1]=='C'){result+=90;i++;} else{result+=10;} }else if(s[i]=='C'){ if(i+1<s.size()&&s[i+1]=='D'){result+=400;i++;} else if(i+1<s.size()&&s[i+1]=='M'){result+=900;i++;} else{result+=100;} }else if(s[i]=='V'){result+=5;} else if(s[i]=='L'){result+=50;} else if(s[i]=='D'){result+=500;} else if(s[i]=='M'){result+=1000;} } return result; } };
2.反向思维更巧妙
-
既然正向读数需要判断,那么反过来读取会不会更容易呢?
-
根据力扣12题我们可以知道,整数转罗马数字过程中,每次取出尽可能大的数字放在罗马字母中。因此正常情况下罗马字母代表的数值从左到右是递减的;
-
唯一可能出现的例外,就是4、9这样的情况,例如对于IV,我们需要+5-1=+4;
-
因此我们从右到左遍历,记录下遇到过的最大的数值max_num,<=max_num的数就加,否则就减,就能得到结果。
-
class Solution { public: int romanToInt(string s) { unordered_map<char, int> mapp = {{'I', 1},{'V', 5},{'X', 10},{'L', 50},{'C', 100},{'D', 500},{'M', 1000}}; int result=0; int max_num=0; for(int i=s.size()-1;i>=0;i--){ int now_val=mapp[s[i]]; if(max_num<=now_val){ max_num=now_val; result+=now_val; }else{ result-=now_val; } } return result; } };