問題描述
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
Subscribe to see which companies asked this question
補(bǔ)充說明:
這個(gè)題目的要求很簡(jiǎn)單,給定你一個(gè)羅馬字符串绘搞,給出它的阿拉伯?dāng)?shù)字表示敲茄。
方案分析
- 什么是羅馬數(shù)字帖族?
維基百科說明 [1]: https://en.wikipedia.org/wiki/Roman_numerals "Roman numerals"
簡(jiǎn)要的說明一下,
<table class="wikitable">
<tr>
<th>Symbol</th>
<td><span class="times-serif" title="Roman numeral">I</span></td>
<td><span class="times-serif" title="Roman numeral">V</span></td>
<td><span class="times-serif" title="Roman numeral">X</span></td>
<td><span class="times-serif" title="Roman numeral">L</span></td>
<td><span class="times-serif" title="Roman numeral">C</span></td>
<td><span class="times-serif" title="Roman numeral">D</span></td>
<td><span class="times-serif" title="Roman numeral">M</span></td>
</tr>
<tr>
<th>Value</th>
<td>1</td>
<td>5</td>
<td>10</td>
<td>50</td>
<td>100</td>
<td>500</td>
<td>1,000</td>
</tr>
</table>
上面表格給出的是常用的羅馬字符對(duì)應(yīng)的阿拉伯?dāng)?shù)值赁炎。
<strong>要注意的來了:</strong>
<table class="wikitable">
<tbody><tr>
<th>Number</th>
<td>4</td>
<td>9</td>
<td>40</td>
<td>90</td>
<td>400</td>
<td>900</td>
</tr>
<tr>
<th>Notation</th>
<td><span class="times-serif" title="Roman numeral">IV</span></td>
<td><span class="times-serif" title="Roman numeral">IX</span></td>
<td><span class="times-serif" title="Roman numeral">XL</span></td>
<td><span class="times-serif" title="Roman numeral">XC</span></td>
<td><span class="times-serif" title="Roman numeral">CD</span></td>
<td><span class="times-serif" title="Roman numeral">CM</span></td>
</tr>
</tbody></table>
- <span class="times-serif" title="Roman numeral">I</span> placed before <span class="times-serif" title="Roman numeral">V</span> or <span class="times-serif" title="Roman numeral">X</span> indicates one less, so four is <span class="times-serif" title="Roman numeral">IV</span> (one less than five) and nine is <span class="times-serif" title="Roman numeral">IX</span> (one less than ten)
- <span class="times-serif" title="Roman numeral">X</span> placed before <span class="times-serif" title="Roman numeral">L</span> or <span class="times-serif" title="Roman numeral">C</span> indicates ten less, so forty is <span class="times-serif" title="Roman numeral">XL</span> (ten less than fifty) and ninety is <span class="times-serif" title="Roman numeral">XC</span> (ten less than a hundred)
- <span class="times-serif" title="Roman numeral">C</span> placed before <span class="times-serif" title="Roman numeral">D</span> or <span class="times-serif" title="Roman numeral">M</span> indicates a hundred less, so four hundred is <span class="times-serif" title="Roman numeral">CD</span> (a hundred less than five hundred) and nine hundred is <span class="times-serif" title="Roman numeral">CM</span> (a hundred less than a thousand)<sup id="cite_ref-sun_5-0" class="reference">[5]
簡(jiǎn)單翻譯一下妇穴,就是:
當(dāng)I出現(xiàn)在V和X前面的時(shí)候,相當(dāng)于減去1;
當(dāng)X出現(xiàn)在L和C前面的時(shí)候诡挂,相當(dāng)與減去10;
當(dāng)C出現(xiàn)在D和M前面的時(shí)候临谱,相當(dāng)于減去100;
- 前面那段是簡(jiǎn)介璃俗,基本要傳遞出來的就是兩點(diǎn):
(1)哪個(gè)羅馬字符對(duì)應(yīng)哪個(gè)阿拉伯值。
(2)一句話給你概括了悉默,就是當(dāng)后面的那個(gè)羅馬數(shù)字比前面羅馬數(shù)字大的話城豁,相當(dāng)于減去后面那個(gè)羅馬數(shù)字的值。
python實(shí)現(xiàn)
class Solution:
"""
:type s: str
:rtype: int
"""
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]]