LeetCodeローマ数字回転整数-C++
ローマ数字には、I、V、X、L、C、D、Mの7文字が含まれています.
例えば、ローマ数字2はIIと書かれており、2つの並列の1である.12はXIIと書きます.つまりX+IIです.27 XXVIIと書くと、XX+V+IIとなります.
通常、ローマ数字の中で小さい数字は大きな数字の右側にあります.しかし、例えば4はIIIではなくIVと書くという特例もある.数字1は数字5の左側にあり、表す数は大数5から小数1を減らした数値4に等しい.同様に、数字9はIXとして表される.この特殊なルールは、次の6つの場合にのみ適用されます. Iは、V(5)およびX(10)の左側に配置され、4および9を表すことができる. Xは、L(50)およびC(100)の左側に配置され、40および90を表すことができる. Cは、D(500)およびM(1000)の左側に配置され、400および900を表すことができる.ローマ数字を指定し、整数に変換します.入力は1~3999の範囲であることを確認します.
例1:
例2:
例3:
例4:
例5:
難点は、数字を減らす必要がある場合、例えば
コード:
実行時間:40 ms、Roman to IntegerのC++コミットで95.31%のユーザーメモリ消費量:8.3 MBを破り、Roman to IntegerのC++コミットで94.04%のユーザーを破った
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例えば、ローマ数字2はIIと書かれており、2つの並列の1である.12はXIIと書きます.つまりX+IIです.27 XXVIIと書くと、XX+V+IIとなります.
通常、ローマ数字の中で小さい数字は大きな数字の右側にあります.しかし、例えば4はIIIではなくIVと書くという特例もある.数字1は数字5の左側にあり、表す数は大数5から小数1を減らした数値4に等しい.同様に、数字9はIXとして表される.この特殊なルールは、次の6つの場合にのみ適用されます.
例1:
: "III"
: 3
例2:
: "IV"
: 4
例3:
: "IX"
: 9
例4:
: "LVIII"
: 58
: L = 50, V= 5, III = 3.
例5:
: "MCMXCIV"
: 1994
: M = 1000, CM = 900, XC = 90, IV = 4.
難点は、数字を減らす必要がある場合、例えば
IV
に5-1 = 4
が必要だということです.実は同时に隣接する数字をまとめると、左の数字が右の数字より小さいと、左の数字を減算します.コード:
class Solution {
#define I 1
#define V 5
#define X 10
#define L 50
#define C 100
#define D 500
#define M 1000
public:
int getNums(char *p)
{
switch(*p)
{
case 'I':
return 1;
case 'V':
return 5;
case 'X':
return 10;
case 'L':
return 50;
case 'C':
return 100;
case 'D':
return 500;
case 'M':
return 1000;
default:
return 0;
}
}
int romanToInt(string s) {
int num = 0;
int strLen = s.length();
for(int i = 0; i < strLen - 1; ++i)
{
int val_p = getNums(&s[i]);
int val_q = getNums(&s[i+1]);
if(val_p < val_q)
num -= val_p;
else
num += val_p;
}
num += getNums(&s[strLen - 1]);
return num;
}
};
実行時間:40 ms、Roman to IntegerのC++コミットで95.31%のユーザーメモリ消費量:8.3 MBを破り、Roman to IntegerのC++コミットで94.04%のユーザーを破った