leetcode刷题笔记十三 罗马数字转数字 Scala版本
源地址:罗马数字转数字
问题描述:
oman numerals are represented by seven different symbols:
I
,V
,X
,L
,C
,D
andM
.
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 simplyX
+II
. The number twenty seven is written asXXVII
, which isXX
+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 asIV
. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written asIX
. There are six instances where subtraction is used:
I
can be placed beforeV
(5) andX
(10) to make 4 and 9.X
can be placed beforeL
(50) andC
(100) to make 40 and 90.C
can be placed beforeD
(500) andM
(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.
简要思路分析:
与数字转罗马字母类似,通过映射或者数组建立罗马字母与数值间的对应关系,通过分析罗马字母的构成特点,若s(i-1) < s(i) ,如IX意味着需要将sum值减去s(i-1),否则加上。为了方便考虑边界问题,我们增加了O->0,置于s串末尾。
代码补充:
object Solution {
def romanToInt(s: String): Int = {
val dict : Map[Char,Int] = Map(
'O' -> 0,
'I' -> 1,
'V' -> 5,
'X' -> 10,
'L' -> 50,
'C' -> 100,
'D' -> 500,
'M' -> 1000
)
var ans:Int = 0
var sStr = s + 'O'
for (i <- 0 to s.length-1){
//println("-------" + i + "--------")
//println("s(i): " + dict(s(i)))
//println("s(i+1): " + dict(s(i+1)))
if (dict(sStr(i)) < dict(sStr(i+1))){
ans = ans - dict(s(i))
}
else
{ans = ans + dict(sStr(i))}
//println("ans: " + ans)
}
return ans
}
}