羅馬數(shù)字包含以下七種字符:I壁熄, V, X晨继, L凰盔,C,D 和 M掷贾。
字符 | 數(shù)值 |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
例如睛榄, 羅馬數(shù)字 2 寫做 II ,即為兩個并列的 1想帅。12 寫做 XII 场靴,即為 X + II 。 27 寫做 XXVII, 即為 XX + V + II 。
通常情況下旨剥,羅馬數(shù)字中小的數(shù)字在大的數(shù)字的右邊咧欣。但也存在特例,例如 4 不寫做 IIII轨帜,而是 IV魄咕。數(shù)字 1 在數(shù)字 5 的左邊,所表示的數(shù)等于大數(shù) 5 減小數(shù) 1 得到的數(shù)值 4 蚌父。同樣地哮兰,數(shù)字 9 表示為 IX。這個特殊的規(guī)則只適用于以下六種情況:
I 可以放在 V (5) 和 X (10) 的左邊苟弛,來表示 4 和 9喝滞。
X 可以放在 L (50) 和 C (100) 的左邊,來表示 40 和 90嗡午。
C 可以放在 D (500) 和 M (1000) 的左邊囤躁,來表示 400 和 900。
給定一個羅馬數(shù)字荔睹,將其轉(zhuǎn)換成整數(shù)狸演。輸入確保在 1 到 3999 的范圍內(nèi)。
示例 1:
輸入: "III"
輸出: 3
示例 2:
輸入: "IV"
輸出: 4
示例 3:
輸入: "IX"
輸出: 9
示例 4:
輸入: "LVIII"
輸出: 58
解釋: C = 100, L = 50, XXX = 30, III = 3.
示例 5:
輸入: "MCMXCIV"
輸出: 1994
解釋: M = 1000, CM = 900, XC = 90, IV = 4.
簡單的匹配操作僻他,每次最多匹配兩位(最長的字符可能就是兩位)宵距。由于給定的都是合法的羅馬數(shù),所以順序不用刻意去管吨拗。也即是 假設(shè)輸入 IIIV 這樣的數(shù)字满哪,我們也當(dāng)做1+1+4=6來看待
我采用的方法非常的暴力
后來看了這篇博客《[LeetCode]13. Roman to Integer(羅馬數(shù)字轉(zhuǎn)化為整數(shù))》
羅馬數(shù)字中,除了特殊的如IV等字符外劝篷,所有字符應(yīng)該是按所代表的權(quán)值順序降低的哨鸭。也就是找到所有的異常位置(后一個字符權(quán)值 > 當(dāng)前字符權(quán)值),就可以很快的計算結(jié)果了娇妓。
具體代碼:
#include<vector>
#include<ctype.h>
#include<stdio.h>
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
int romanToInt(string s) {
int len = 0;
int res = 0;
while(len < s.size()){
//不存在匹配第二位的字符
if(s[len] == 'V'){
res += 5;
}
else if(s[len] == 'L'){
res += 50;
}
else if(s[len] == 'D'){
res += 500;
}
else if(s[len] == 'M'){
res += 1000;
}
else if(s[len] == 'I'){
len++;
if(len == s.size()){
res += 1;
break;
}
if(s[len] == 'V'){
res += 4;
}
else if(s[len] == 'X'){
res += 9;
}
else{
res += 1;
continue;
}
}
else if(s[len] == 'X'){
len++;
if(len == s.size()){
res += 10;
break;
}
if(s[len] == 'L'){
res += 40;
}
else if(s[len] == 'C'){
res += 90;
}
else{
res += 10;
continue;
}
}
else{
len++;
if(len == s.size()){
res += 100;
break;
}
if(s[len] == 'D'){
res += 400;
}
else if(s[len] == 'M'){
res += 900;
}
else{
res += 100;
continue;
}
}
len++;
}
return res;
}
int main(){
cout << romanToInt("III") << endl;
cout << romanToInt("IV") << endl;
cout << romanToInt("IX") << endl;
cout << romanToInt("LVIII") << endl;
cout << romanToInt("MCMXCIV") << endl;
cout << romanToInt("MCDLXXVI") << endl;
return 0;
}