(LeetCode ) 13. 罗马数字转整数 (哈希表)
题目:13. 罗马数字转整数
思路:哈希表,时间复杂度0(n)。
比较相邻的两个字符对应的数值,左边的数值x<右边的数值y时,说明这个左边的数值是要减去的,反之,则加上。最后一个字符对应的数值一定是加上的。
C++版本:
class Solution {
public:int romanToInt(string s) {unordered_map<char,int> mp={{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000}};int n=s.size();int sum=0;for(int i=1;i<n;i++){int x=mp[s[i-1]];int y=mp[s[i]];cout<<"i:"<<i<<",x:"<<x<<",y"<<y<<endl;sum += x<y ? -x:x;}return sum+mp[s[n-1]];}
};
JAVA版本:
class Solution {public int romanToInt(String s) {Map<Character,Integer> mp=Map.of('I',1,'V',5,'X',10,'L',50,'C',100,'D',500,'M',1000);char[] c=s.toCharArray();int n=c.length;int sum=0;for(int i=1;i<n;i++){int x=mp.get(c[i-1]);int y=mp.get(c[i]);sum+= x<y?-x:x;}return sum+mp.get(c[n-1]);}
}
Go版本:
func romanToInt(s string) int {mp:=map[byte]int{'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000,}sum:=0n:=len(s)for i:=1;i<n;i++ {x,y:=mp[s[i-1]],mp[s[i]]if x<y {sum-=x}else{sum+=x}}return sum+mp[s[n-1]]
}