LeetCode之Roman to Integer(羅馬數字 簡單 字串)
阿新 • • 發佈:2018-11-10
問題描述:
:羅馬數字是由七個不同的符號來表示 I
,V
,X
,L
,C
,D
和M
。
Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000
例如,兩個用II
羅馬數字寫成,只有兩個加在一起。十二寫為,XII
簡稱X
+ II
。數字二十七寫為XXVII
,XX
+ V
+ II
。
羅馬數字通常從左到右從最大到最小。但是,四個數字不是IIII
。相反,第四個被寫為IV
。因為一個在五個之前,我們減去四個。同樣的原則適用於編號為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的範圍內。
題解比較簡單 直接程式碼搞定
public class Solution { //判斷輸入字元是否合法 public boolean isExist(char c){ return c=='I'||c=='V'||c=='X'||c=='L'||c=='C'||c=='D'||c=='M'; } public int romanToInt(String s) { if(s==null||s=="") { return -1; } Map<Character,Integer> mapping = new HashMap<Character, Integer>(); mapping.put('I',1); mapping.put('V',5); mapping.put('X',10); mapping.put('L',50); mapping.put('C',100); mapping.put('D',500); mapping.put('M',1000); if(s.length()<2){ if(mapping.containsKey(s.charAt(0))){ return mapping.get(s.charAt(0)); } return -1; } char[] c= s.toCharArray(); int sum = 0; int preTemp=0; int nextTemp=0; for(int pre=0,next=1;next<c.length;){ if(!isExist(c[next])||!isExist(c[pre])){ return -1; } preTemp = mapping.get(c[pre]); nextTemp = mapping.get(c[next]); if(preTemp>=nextTemp){ sum+=preTemp; if(next==c.length-1){ sum+=nextTemp; } pre++; next++; }else{ sum=sum+(nextTemp-preTemp); if(next==c.length-2){ if(!isExist(c[++next])){ return -1; }else{ sum+=mapping.get(c[next]); } } pre+=2; next+=2; } } return sum; }
下面附上大神程式碼 但是沒有判斷字符合法性 不過執行速度超快
class Solution { public int romanToInt(String s) { if (s == null || s.length() == 0) { return 0; } Map<Character, Integer> mapping = new HashMap<>(); mapping.put('I', 1); mapping.put('V', 5); mapping.put('X', 10); mapping.put('L', 50); mapping.put('C', 100); mapping.put('D', 500); mapping.put('M', 1000); int res = 0; for (char c : s.toCharArray()) { res += mapping.get(c); } if (s.indexOf("IV") != -1 || s.indexOf("IX") != -1) { res -= 2; } if (s.indexOf("XL") != -1 || s.indexOf("XC") != -1) { res -= 20; } if (s.indexOf("CD") != -1 || s.indexOf("CM") != -1) { res -= 200; } return res; } }