給定一個羅馬數字 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);
}