您的位置:首页 > 其它

[LeetCode] 13. Roman to Integer 罗马数字转为整数

2018-03-02 14:54 399 查看

Roman numerals are represented by seven different symbols: 

I
V
X
L
C
D
 and 
M
.

Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

For example, two is written as 

II
 in Roman numeral, just two one's added together. Twelve is written as, 
XII
, which is simply 
X
 + 
II
. The number twenty seven is written as 
XXVII
, which is 
XX
 + 
V
 + 
II
.

Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not 

IIII
. Instead, the number four is written as 
IV
. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as 
IX
. There are six instances where subtraction is used:

  • I
     can be placed before 
    V
     (5) and 
    X
     (10) to make 4 and 9. 
  • X
     can be placed before 
    L
     (50) and 
    C
     (100) to make 40 and 90. 
  • C
     can be placed before 
    D
     (500) and 
    M
     (1000) to make 400 and 900.

Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.

Example 1:

Input: "III"
Output: 3

Example 2:

Input: "IV"
Output: 4

Example 3:

Input: "IX"
Output: 9

Example 4:

Input: "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.

Example 5:

Input: "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

12. Integer to Roman 的拓展,反过来转换,将罗马数字转为整数。

Java:

public int romanToInt(String s) {
int sum=0;
if(s.indexOf("IV")!=-1){sum-=2;}
if(s.indexOf("IX")!=-1){sum-=2;}
if(s.indexOf("XL")!=-1){sum-=20;}
if(s.indexOf("XC")!=-1){sum-=20;}
if(s.indexOf("CD")!=-1){sum-=200;}
if(s.indexOf("CM")!=-1){sum-=200;}

char c[]=s.toCharArray();
int count=0;

for(;count<=s.length()-1;count++){
if(c[count]=='M') sum+=1000;
if(c[count]=='D') sum+=500;
if(c[count]=='C') sum+=100;
if(c[count]=='L') sum+=50;
if(c[count]=='X') sum+=10;
if(c[count]=='V') sum+=5;
if(c[count]=='I') sum+=1;

}

return sum;

}

Java:

public int romanToInt(String s) {
int nums[]=new int[s.length()];
for(int i=0;i<s.length();i++){
switch (s.charAt(i)){
case 'M':
nums[i]=1000;
break;
case 'D':
nums[i]=500;
break;
case 'C':
nums[i]=100;
break;
case 'L':
nums[i]=50;
break;
case 'X' :
nums[i]=10;
break;
case 'V':
nums[i]=5;
break;
case 'I':
nums[i]=1;
break;
}
}
int sum=0;
for(int i=0;i<nums.length-1;i++){
if(nums[i]<nums[i+1])
sum-=nums[i];
else
sum+=nums[i];
}
return sum+nums[nums.length-1];
}  

Python:

class Solution:
# @param {string} s
# @return {integer}
def romanToInt(self, s):
roman = {'M': 1000,'D': 500 ,'C': 100,'L': 50,'X': 10,'V': 5,'I': 1}
z = 0
for i in range(0, len(s) - 1):
if roman[s[i]] < roman[s[i+1]]:
z -= roman[s[i]]
else:
z += roman[s[i]]
return z + roman[s[-1]] 

Python:

class Solution:
# @return an integer
def romanToInt(self, s):
numeral_map = {"I": 1, "V": 5, "X": 10, "L": 50, "C":100, "D": 500, "M": 1000}
decimal = 0
for i in xrange(len(s)):
if i > 0 and numeral_map[s[i]] > numeral_map[s[i - 1]]:
decimal += numeral_map[s[i]] - 2 * numeral_map[s[i - 1]]
else:
decimal += numeral_map[s[i]]
return decimal

Python:

def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
_dict = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
prev = 0
sum = 0
for i in s[::-1]:
curr = _dict[i]
if prev > curr:
sum -= curr
else:
sum += curr
prev = curr
return sum  

C++:

class Solution {
public:
int romanToInt(string s) {
unordered_map<char, int> numeral_map = {{'I',    1}, {'V',   5}, {'X',  10},
{'L',   50}, {'C', 100}, {'D', 500},
{'M', 1000}};
int decimal = 0;
for (int i = 0; i < s.length(); ++i) {
if (i > 0 && numeral_map[s[i]] > numeral_map[s[i - 1]]) {
decimal += numeral_map[s[i]] - 2 * numeral_map[s[i - 1]];
} else {
decimal += numeral_map[s[i]];
}
}
return decimal;
}
};

 

类似题目:

[LeetCode] 12. Integer to Roman 整数转为罗马数字

 

All LeetCode Questions List 题目汇总

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: