天天看點

羅馬數字轉換為整數

給定一個羅馬數字 ss,将羅馬數字轉換成整數。

如羅馬數字

I

II

III

IV

V

分别代表數字 1, 2, 3, 4, 51,2,3,4,5。

首先要來了解一下羅馬數字表示法,基本字元有 77 個:

I

V

X

L

C

D

M

,分别表示 11、55、1010、5050、100100、500500、10001000。

在構成數字的時候,有下列規則:

1、相同的數字連寫,所表示的數等于這些數字相加得到的數,如:

III

 = 3=3;

2、小的數字在大的數字的右邊,所表示的數等于這些數字相加得到的數, 如:

VIII

 = 8=8;

XII

 = 12=12;

3、小的數字,(限于

X

C

)在大的數字的左邊,所表示的數等于大數減小數得到的數,如:

IV

 = 4=4;

IX

 = 9=9;

4、正常使用時,連寫的數字重複不得超過三次。

輸入格式

輸入一個羅馬數字字元串,其對應的數字為 s(1 \leq s \leq 3999)s(1≤s≤3999)。

輸出格式

輸出對應的整數 ss。

樣例輸入

CXXIII      

樣例輸出

123      
思路:分析羅馬數字的特點,發現,羅馬數字的目前字元和前一個字元的規律:      
1.目前字元和前一個字元相等那麼,結果暫時加入總數      
2.目前字元大于前一個字元,那麼結果是目前字元的大小減去前面的字元數和      
3.目前字元小于前一個字元,那麼直接加入總數。      
是以需要記錄目前字元的前一個字元的大小,字元相等時候的累加和,總的大小。這三個變量。      
最後給出源代碼:      
 public static int romanToInt(String s) {
	        if (s.length() < 1)
	            return 0;
	        int result = 0;
	        int sub = getRomanValue(s.charAt(0));
	        int lastv = sub;
	        for (int i = 1; i < s.length(); ++i) {
	            char curc = s.charAt(i);
	            int curv = getRomanValue(curc);
	            if (curv == lastv)
	                sub += curv;
	            // 目前一個字元大于目前字元時,情況比較特殊,這個時候,隻能講last包括last的字元算在sub内,相加得到result,
	            // 至于curr還需要根據curr後面的字元判斷
	            else if (curv < lastv) {
	                result += sub;
	                sub = curv;
	            } else {
	                sub = curv - sub;
	            }
	            lastv = curv;
	        }
	        result += sub;
	        return result;
	    }


	    public static int getRomanValue(char c) {
	        Map<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);
	        return map.get(c);


	    }      

繼續閱讀