13. Roman to Integer
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
class Solution {
public:
int romanToInt(string s) {
}
};
解题思路:
题目背景解析:
罗马数字共有
7
个,即
I(1)
,
V(5)
,
X(10)
,
L(50)
,
C(100)
,
D(500)
,
M(1000)
。
具体
roman
数字表示如下
I
|
V
|
X
|
L
|
C
|
D
|
M
|
1
|
5
|
10
|
50
|
100
|
500
|
1000
|
7
个字母分别代表不同的数字,用这
7
个字母排列组成可以组成所有的整数。
简单规则如下:
1
、相同的字母或者小的字母在大字母前就是相加。
III = 3 IV =6 ;
2
、大的字母在小的字母前面就是想减。
VI = 4 CM = 900;
-
自己的解题思路
利用
hash
进行快速读取,然后从头到尾因此遍历,如果第一次遍历的数,比接下来遍历的数小,则减掉第一次遍历的数值,否则加上。对于最后一位,则是直接加上相应的数值。
-
别人的解题思路
思路大体一致。
打表法。将
Hash
表直接换成
vector
或者数组,进行直接读取。
LL(1)
学习收获:
-
被大神们的打表法,以及去 if 神技吓尿;看见 LL(1), 这样的编译原理的词法分析更直接跪了。
-
LL(1) 还没有看懂,其他的都能接受。
附件
1
:程序
1
、自己的程序:
class
Solution
{
public
:
int
romanToInt
(
string
s
)
{
map
<
char
,
int
>
rmaMap
=
{
{
'I'
,
1
},
{
'V'
,
5
},
{
'X'
,
10
},
{
'L'
,
50
},
{
'C'
,
100
},
{
'D'
,
500
},
{
'M'
,
1000
}
};
int
res
=
0
;
for
(
string
::
size_type
i
=
0
;
i
!=
s
.
size
();
++
i
)
{
auto
j
=
i
+
1
;
int
val
=
rmaMap
[
s
[
i
]];
if
(
j
!=
s
.
size
()
&&
val
<
rmaMap
[
s
[
j
]])
{
res
-=
val
;
}
else
{
res
+=
val
;
}
}
return
res
;
}
};
2
、别人的程序
打表法
class
Solution
{
public
:
int
romanToInt
(
string
s
)
{
int
num
[
256
]
=
{
0
};
int
result
=
0
;
num
[
'I'
]
=
1
;
num
[
'V'
]
=
5
;
num
[
'X'
]
=
10
;
num
[
'L'
]
=
50
;
num
[
'C'
]
=
100
;
num
[
'D'
]
=
500
;
num
[
'M'
]
=
1000
;
int
i
=
0
;
while
(
i
<
s
.
size
())
{
if
(
num
[
s
[
i
]]
<
num
[
s
[
i
+
1
]])
result
-=
num
[
s
[
i
]];
else
result
+=
num
[
s
[
i
]];
i
++;
}
return
result
;
}
};
去掉
if-else
版
具体思路如下:
result = isTrue * ...
true
expression...
+ (
1
- isTrue) * ...
false
expression...
class
Solution
{
public
:
int
romanToInt
(
string
s
)
{
unordered_map
<
char
,
int
>
romanMap
=
{
{
'I'
,
1
},
{
'V'
,
5
},
{
'X'
,
10
},
{
'L'
,
50
},
{
'C'
,
100
},
{
'D'
,
500
},
{
'M'
,
1000
}
};
int
num
=
romanMap
.
at
(
s
.
back
());
int
prev
=
num
;
for
(
int
i
=
s
.
length
()
-
2
;
i
>=
0
;
--
i
)
{
int
cur
=
romanMap
.
at
(
s
.
at
(
i
));
int
curLargerThanPrev
=
cur
>=
prev
;
num
+=
(
2
*
curLargerThanPrev
-
1
)
*
cur
;
prev
=
cur
;
}
return
num
;
}
};
附件2:扩展阅读
参考资料:
可以仔细看看。分析的优化,以及打表法。
介绍一个
LL(1)
文法的解法。很新颖,需要学习。