[Swift]LeetCode13. 羅馬數字轉整數 | Roman to Integer

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-awgawmnz-me.html 
➤若是連接不是山青詠芝的博客園地址,則多是爬取做者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持做者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html

Roman numerals are represented by seven different symbols: IVXLCD and M.git

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.github

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.app

Example 1:code

Input: "III"
Output: 3

Example 2:htm

Input: "IV"
Output: 4

Example 3:blog

Input: "IX"
Output: 9

Example 4:索引

Input: "LVIII"
Output: 58
Explanation: C = 100, L = 50, XXX = 30 and III = 3.

Example 5:ip

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

羅馬數字包含如下七種字符:I, V, X, LCD 和 M

字符          數值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 羅馬數字 2 寫作 II ,即爲兩個並列的 1。12 寫作 XII ,即爲 X + II 。 27 寫作  XXVII, 即爲 XX + V + II 。

一般狀況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫作 IIII,而是 IV。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減少數 1 獲得的數值 4 。一樣地,數字 9 表示爲 IX。這個特殊的規則只適用於如下六種狀況:

  • I 能夠放在 V (5) 和 X (10) 的左邊,來表示 4 和 9。
  • X 能夠放在 L (50) 和 C (100) 的左邊,來表示 40 和 90。 
  • C 能夠放在 D (500) 和 M (1000) 的左邊,來表示 400 和 900。

給定一個羅馬數字,將其轉換成整數。輸入確保在 1 到 3999 的範圍內。

示例 1:

輸入: "III"
輸出: 3

示例 2:

輸入: "IV"
輸出: 4

示例 3:

輸入: "IX"
輸出: 9

示例 4:

輸入: "LVIII"
輸出: 58
解釋: C = 100, L = 50, XXX = 30, III = 3.

示例 5:

輸入: "MCMXCIV"
輸出: 1994
解釋: M = 1000, CM = 900, XC = 90, IV = 4.

 
 1 class Solution {
 2     func romanToInt(_ s: String) -> Int {
 3         //用字典存對照表,單引號字符串查找使用雙引號
 4         var map:[Character:Int]=["I":1,"V":5,"X":10,"L":50,"C":100,"D":500,"M":1000]
 5         //定義局部變量
 6         var ret :Int = 0
 7         //判斷字符串是否爲空
 8         if !s.isEmpty
 9         {
10             //遍歷字符串,indices屬性能夠訪問字符串中各個字符的全部索引。
11             for keys:String.Index in s.indices
12             {
13                 //注意判斷keys的範圍只能到倒數第二位
14                 if   keys < s.index(before: s.endIndex) 
15                      && map[s[keys]]! < map[s[s.index(after: keys)]]!
16                 {
17                     ret -= map[s[keys]]!
18                 }
19                 else
20                 {
21                     ret += map[s[keys]]!
22                 }
23             }
24         }
25         return ret
26     }
27 }

 


高效率版

 1 class Solution {
 2     func romanToInt(_ s: String) -> Int {
 3         var count = 0
 4         var index = s.startIndex
 5         while index != s.endIndex {
 6             let c = s[index]
 7             if c == "I" {
 8                 if s.index(after: index) != s.endIndex && s[s.index(after: index)] == "V" {
 9                     count += 4
10                     index = s.index(after: index)
11                 } else if s.index(after: index) != s.endIndex && s[s.index(after: index)] == "X" {
12                     count += 9
13                     index = s.index(after: index)
14                 } else {
15                     count += 1
16                 }
17                 index = s.index(after: index)
18             } else if c == "X" {
19                 if s.index(after: index) != s.endIndex && s[s.index(after: index)] == "L" {
20                     count += 40
21                     index = s.index(after: index)
22                 } else if s.index(after: index) != s.endIndex && s[s.index(after: index)] == "C" {
23                     count += 90
24                     index = s.index(after: index)
25                 } else {
26                     count += 10
27                 }
28                 index = s.index(after: index)
29             } else if c == "C" {
30                 if s.index(after: index) != s.endIndex && s[s.index(after: index)] == "D" {
31                     count += 400
32                     index = s.index(after: index)
33                 } else if s.index(after: index) != s.endIndex && s[s.index(after: index)] == "M" {
34                     count += 900
35                     index = s.index(after: index)
36                 } else {
37                     count += 100
38                 }
39                 index = s.index(after: index)
40             } else if c == "V" {
41                 count += 5
42                 index = s.index(after: index)
43             } else if c == "L" {
44                 count += 50
45                 index = s.index(after: index)
46             } else if c == "D" {
47                 count += 500
48                 index = s.index(after: index)
49             } else if c == "M" {
50                 count += 1000
51                 index = s.index(after: index)
52             }
53         }
54         return count
55     }
56 }
相關文章
相關標籤/搜索