羅馬數字轉整數

題目描述

羅馬數字包含如下七種字符:I,V,x,L,C,D和M。數組

字符 數值函數

 

I 1spa

V 5code

X 10blog

L 50字符串

C 100get

D 500string

M 1000hash

 

例如,羅馬數字 2 寫作 II ,即爲兩個並列的 1。12寫作 XII,即爲 X + II。27 寫作 X 雙 VII,即爲 XX + V + II。
一般狀況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫作 IIII,而是 IV。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減少數 1 獲得的數值 4。一樣地,數字 9 表示爲 Ix。這個特殊的規則只適用於如下六種狀況:it

  • 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
解釋: L = 50, V= 5, III = 3.

示例 5:

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

 

 

 方法一:暴力法

思路

  1. 將String轉爲char數組

  2. 定義int變量num做爲return的變量

  3. 干擾正常計數的狀況只有IV、IX、XL、XC、CD、CM六種,因此咱們遍歷char數組,注意此次遍歷從i = 0到i = ch.length - 1,由於要判斷ch[i+1]

  4. 判斷ch[i] 和 ch[i+1]的狀況,假如知足IV或者IX,就把num-2,由於IV=4,比起正常的I + V要減小2,依次類推,碰到XL、XC須要num-20,碰到CD、CM須要num-200

  5. 再次遍歷數組,這回就只須要判斷字母是什麼,把num加上對應的值,例如 ch[i] = C; num += 100;

 

class Solution { public int romanToInt(String s) { //將String轉爲char數組
        char[] ch = s.toCharArray(); //定義int遍歷num做爲return的變量
        int num = 0; //干擾正常計數的狀況只有IV、IX、XL、XC、CD、CM 六種,因此咱們遍歷char數組,注意此次遍歷從i到i=ch.length-1,由於要判斷ch[i+1]
        for (int i = 0; i < ch.length - 1; i++) { //判斷ch[i]和ch[i+1]的狀況,假如知足IV或者IX,就把num-2,由於IV=4,比起正常的I + V 要減小2,一次類推,碰到XL,XC須要num-20,碰到CD、CM須要num-200
            if(ch[i] == 'I' && (ch[i + 1] == 'V' || ch[i + 1] == 'X')) num -= 2; if(ch[i] == 'X' && (ch[i + 1] == 'L' || ch[i + 1] == 'C')) num -= 20; if(ch[i] == 'C' && (ch[i + 1] == 'D' || ch[i + 1] == 'M')) num -= 200; } //再次遍歷數組,這回只須要判斷字母是什麼,num加上對應的值,例如ch[i]=M; num+=1000;
        for (int i = 0; i < ch.length; i++) { switch (ch[i]) { case 'M': { num += 1000; continue; } case 'D': { num += 500; continue; } case 'C': { num += 100; continue; } case 'L': { num += 50; continue; } case 'X': { num += 10; continue; } case 'V': { num += 5; continue; } default: { num += 1; continue; } } } return num; }

 

 

 

方法二:hash表

思路

  • 首先將全部的組合可能性列出並添加到哈希表中
  • 而後對字符串進行遍歷,因爲組合只有兩種,一種是 1 個字符,一種是 2 個字符,其中 2 個字符優先於 1 個字符
  • 先判斷兩個字符的組合在哈希表中是否存在,存在則將值取出加到結果 ans 中,並向後移2個字符。不存在則將判斷當前 1 個字符是否存在,存在則將值取出加到結果 ans 中,並向後移 1 個字符
  • 遍歷結束返回結果 ans

 

代碼實現

class Solution { public int romanToInt(String s) { //將全部的組合可能性列出並添加到哈希表中
        Map<String, Integer> map = new HashMap<>(); map.put("I", 1); map.put("IV", 4); map.put("V", 5); map.put("IX", 9); map.put("X", 10); map.put("XL", 40); map.put("L", 50); map.put("XC", 90); map.put("C", 100); map.put("CD", 400); map.put("D", 500); map.put("CM", 900); map.put("M", 1000); //定義答案變量
        int ans = 0; for(int i = 0;i < s.length();) { //若是i+1小於字符串總長度而且字符串中當前第i到i+2這兩個羅馬字符是否在map裏,若是不在則是一個羅馬字符
            if(i + 1 < s.length() && map.containsKey(s.substring(i, i+2))) { //把兩個羅馬字符加到ans答案裏
                ans += map.get(s.substring(i, i+2)); //找到兩個羅馬字符,i則後移兩位
                i += 2; } else { //把一個羅馬字符加到ans答案裏
                ans += map.get(s.substring(i, i+1)); //找到一個羅馬字符,i則後移一位
                i ++; } } return ans; } }

 

知識擴展

【知識卡片】哈希表存儲的是由鍵(key)和值(value)組成的數據。例如,咱們將每一個人的性別做爲數據進行存儲,鍵爲人名,值爲對應的性別。

  • Python 中咱們使用字典key:value}來初始化哈希表
  • 經過key查找value的時間複雜度爲O(1)
  • 這題題解中的d就是一個字典,其中get(key,default)函數能夠經過key從d中找出對應的值,若是key不存在則返回默認值 default
相關文章
相關標籤/搜索