劍指Offer 13. 羅馬數字轉整數
阿新 • • 發佈:2021-06-27
1. 題目
羅馬數字包含以下七種字元:I
,V
,X
,L
,C
,D
和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 的範圍內。
2. 示例
示例1:
輸入: "III"
輸出: 3
示例2:
輸入: "IV"
輸出: 4
示例3:
輸入: "MCMXCIV"
輸出: 1994
解釋: M = 1000, CM = 900, XC = 90, IV = 4.
3. 題解
這道題很明顯使用HashMap來解決。
1 HashMap<String, Integer> map = new HashMap<>();
2 map.put("M", 1000);
3 map.put("CM", 900);
4 map.put("D", 500);
5 map.put("CD", 400);
6 map.put("C", 100);
7 map.put("XC", 90);
8 map.put("L", 50);
9 map.put("XL", 40);
10 map.put("X", 10);
11 map.put("IX", 9);
12 map.put("V", 5);
13 map.put("IV", 4);
14 map.put("I", 1);
發現,鍵裡面最多為兩位長度,所以只要判斷hash表裡是否包含2位和1位即可。
4. 實現
1 public class RomanToInt13 {
2 public int romanToInt(String s) {
3 HashMap<String, Integer> map = new HashMap<>();
4 map.put("M", 1000);
5 map.put("CM", 900);
6 map.put("D", 500);
7 map.put("CD", 400);
8 map.put("C", 100);
9 map.put("XC", 90);
10 map.put("L", 50);
11 map.put("XL", 40);
12 map.put("X", 10);
13 map.put("IX", 9);
14 map.put("V", 5);
15 map.put("IV", 4);
16 map.put("I", 1);
17
18 int ans = 0;
19 for(int i = 0; i < s.length(); i++) {
20 if(i + 1 < s.length() && map.containsKey(s.substring(i, i +2))) {
21 ans += map.get(s.substring(i, i + 2));
22 i++;
23 } else {
24 ans += map.get(s.substring(i, i+1));
25 }
26 }
27 return ans;
28 }
29
30 public static void main(String[] args) {
31 String s = "LVIII";
32 System.out.println(new RomanToInt13().romanToInt(s));
33 }
34 }
5. 結語
努力去愛周圍的每一個人,付出,不一定有收穫,但是不付出就一定沒有收穫! 給街頭賣藝的人零錢,不和深夜還在擺攤的小販討價還價。願我的部落格對你有所幫助(*^▽^*)(*^▽^*)!
如果客官喜歡小生的園子,記得關注小生喲,小生會持續更新(#^.^#)(#^.^#)。