1. 程式人生 > 其它 >20211103 LeetCode刷題 羅馬數字轉整數 (難度:簡單) 我寫的程式碼冗餘執行用時長 僅供參考 建議看原答案

20211103 LeetCode刷題 羅馬數字轉整數 (難度:簡單) 我寫的程式碼冗餘執行用時長 僅供參考 建議看原答案

題目:

羅馬數字包含以下七種字元: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 的範圍內。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/roman-to-integer
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

答案:

class Solution {
     public int romanToInt(String s) {
              //將所有的特殊情況列出
String s1 = "IV"; String s2 = "IX"; String s3 = "XL"; String s4 = "XC"; String s5 = "CD"; String s6 = "CM"; List<String> sList = new ArrayList(); sList.add(s1); sList.add(s2); sList.add(s3); sList.add(s4); sList.add(s5); sList.add(s6); HashMap
<Character, Integer> map = new HashMap(); map.put('I', 1); map.put('V', 5); map.put('X', 10); map.put('L', 50); map.put('C', 100); map.put('D', 500); map.put('M', 1000); boolean flag = false; for (int i = 0; i < sList.size(); i++) { if (s.contains(sList.get(i))) { flag = true; break; } } int sum = 0; char[] chars = s.toCharArray(); if (!flag ) {//不存在特殊情況 Set keySet = map.keySet(); for (char c : chars ) { if (keySet.contains(c)) { sum += map.get(c); } } }else{//如果出現特殊情況 for(int i=0;i<chars.length-1;i++){ System.out.println(new StringBuffer().append(String.valueOf(chars[i])).append(String.valueOf(chars[i+1]))); String sw=new StringBuffer().append(String.valueOf(chars[i])).append(String.valueOf(chars[i+1])).toString(); if("IV".equals(sw)){ sum+=4; i++; if(i==chars.length-2){ sum+=map.get(chars[i+1]); } continue; }else if("IX".equals(sw)){ sum+=9; i++; if(i==chars.length-2){ sum+=map.get(chars[i+1]); } continue; }else if("XL".equals(sw)){ sum+=40; i++; if(i==chars.length-2){ sum+=map.get(chars[i+1]); } continue; }else if("XC".equals(sw)){ sum+=90; i++; if(i==chars.length-2){ sum+=map.get(chars[i+1]); } continue; }else if("CD".equals(sw)){ sum+=400; i++; if(i==chars.length-2){ sum+=map.get(chars[i+1]); } continue; }else if("CM".equals(sw)){ sum+=900; i++; if(i==chars.length-2){ sum+=map.get(chars[i+1]); } continue; }else{ sum+=map.get(chars[i]); if(i==chars.length-2){ sum+=map.get(chars[i+1]); } } } } return sum; } }

結果:

執行結果: 通過 顯示詳情

新增備註

執行用時:31 ms, 在所有Java提交中擊敗了5.31%的使用者 記憶體消耗:39.5 MB, 在所有Java提交中擊敗了5.12%的使用者 通過測試用例:3999/3999