LeetCode:Roman to Integer,Integer to Roman
6618 ワード
まずローマ数字を簡単に紹介します.ウィキペディアから抜粋します.
ローマ数字は、I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、M(1000)の7つである.任意の正の整数を下記の規則で表すことができる.なお、ローマ数字には「0」はなく、進位制とは無関係である.ローマ数字は算数にのみ用いられ、演算は行われないと考えられる.
数回繰り返す:1つのローマ数字が数回繰り返されると、この数の数の数倍を表します.
右プラス左マイナス:
大きいローマ数字の右側に小さいローマ数字を記入し、大きい数字に小さい数字を加えることを示します.
大きなローマ数字の左側に小さいローマ数字を記入し、大きな数字が数字を減らすことを示します.
左マイナスの数字には制限があり、I、X、Cに限られています.例えば45はVLと書くことができなくて、XLV しかありません
ただし、左マイナスでは1桁を越えてはいけません.例えば、99はIC()で表すのではなく、XCIX()で表す.(アラビア数字の1桁あたりの数字に等しい.)左マイナスは1桁でなければなりません.例えば、8はIIXではなくVIIIと書きます.
右の数字は3桁を連続的に超えてはならない.例えば、14はXIIIではなくXIVと書く.(下の「デジタル制限」の項を参照.)
プラス千:
ローマ数字の上に横線を付けるか、下付きの
同様に、上に2本の横線がある場合、原数の100000()倍である.
デジタル制限:
同じ数字は最大3回しか現れません.40はXXXXではなく、XLで表示します.
例外:IVは古代ローマ神話の主神ジュピット(すなわちIVPITER、古代ローマ文字にはJとUがない)の頭字であるため、IVの代わりにIIIを用いることがある.
Roman to Integer
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
3999の範囲内のローマ数字は、線を引いたアルファベットは使用されません.
最後の文字から、現在の文字に対応する数字が前の数字より小さい場合は、結果から現在の文字に対応する数字を減算します.そうしないと、現在の文字に対応する数字が加算されます.境界状況を処理するために、元の末尾文字である元の文字列に最後に文字を追加します.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Integer to Roman
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999
ローマ数字のアルファベットは規則的で、いくつかのグループに分けられることに気づきました.I(1)、V(5)はグループで、X(10)、L(50)はグループで、C(100)、D(500)はグループで、M(1000)、d(Dに線引きを加えて5000を表すべき)はグループです.......次のグループの2つの数は前のグループの10倍です.
10より大きい整数については,この整数をビット単位でローマ数字として表す.本文の住所
個位の数字1~9のそれぞれは、IIIIII IV V VII VIII IX
10桁上の数字1~9は、元の桁上のIをX、VをL、XをCに置き換える、すなわち10桁上の1~9は10~90を表す.
百位、千位はこのように推す....
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
【著作権声明】転載は出典を明記してください:http://www.cnblogs.com/TenosDoIt/p/3793503.html
ローマ数字は、I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、M(1000)の7つである.任意の正の整数を下記の規則で表すことができる.なお、ローマ数字には「0」はなく、進位制とは無関係である.ローマ数字は算数にのみ用いられ、演算は行われないと考えられる.
数回繰り返す:1つのローマ数字が数回繰り返されると、この数の数の数倍を表します.
右プラス左マイナス:
大きいローマ数字の右側に小さいローマ数字を記入し、大きい数字に小さい数字を加えることを示します.
大きなローマ数字の左側に小さいローマ数字を記入し、大きな数字が数字を減らすことを示します.
左マイナスの数字には制限があり、I、X、Cに限られています.例えば45はVLと書くことができなくて、XLV しかありません
ただし、左マイナスでは1桁を越えてはいけません.例えば、99はIC()で表すのではなく、XCIX()で表す.(アラビア数字の1桁あたりの数字に等しい.)左マイナスは1桁でなければなりません.例えば、8はIIXではなくVIIIと書きます.
右の数字は3桁を連続的に超えてはならない.例えば、14はXIIIではなくXIVと書く.(下の「デジタル制限」の項を参照.)
プラス千:
ローマ数字の上に横線を付けるか、下付きの
同様に、上に2本の横線がある場合、原数の100000()倍である.
デジタル制限:
同じ数字は最大3回しか現れません.40はXXXXではなく、XLで表示します.
例外:IVは古代ローマ神話の主神ジュピット(すなわちIVPITER、古代ローマ文字にはJとUがない)の頭字であるため、IVの代わりにIIIを用いることがある.
Roman to Integer
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
3999の範囲内のローマ数字は、線を引いたアルファベットは使用されません.
最後の文字から、現在の文字に対応する数字が前の数字より小さい場合は、結果から現在の文字に対応する数字を減算します.そうしないと、現在の文字に対応する数字が加算されます.境界状況を処理するために、元の末尾文字である元の文字列に最後に文字を追加します.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class
Solution {
public
:
int
romanToInt(string s) {
int
map[26];
map[
'I'
-
'A'
] = 1; map[
'V'
-
'A'
] = 5; map[
'X'
-
'A'
] = 10; map[
'L'
-
'A'
] = 50;
map[
'C'
-
'A'
] = 100; map[
'D'
-
'A'
] = 500; map[
'M'
-
'A'
] = 1000;
int
res = 0, n = s.size();
s.push_back(s[n-1]);
for
(
int
i = 0; i < n; i++)
{
if
(map[s[i]-
'A'
] >= map[s[i+1]-
'A'
])
res += map[s[i]-
'A'
];
else
res -= map[s[i]-
'A'
];
}
return
res;
}
};
Integer to Roman
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999
ローマ数字のアルファベットは規則的で、いくつかのグループに分けられることに気づきました.I(1)、V(5)はグループで、X(10)、L(50)はグループで、C(100)、D(500)はグループで、M(1000)、d(Dに線引きを加えて5000を表すべき)はグループです.......次のグループの2つの数は前のグループの10倍です.
10より大きい整数については,この整数をビット単位でローマ数字として表す.本文の住所
個位の数字1~9のそれぞれは、IIIIII IV V VII VIII IX
10桁上の数字1~9は、元の桁上のIをX、VをL、XをCに置き換える、すなわち10桁上の1~9は10~90を表す.
百位、千位はこのように推す....
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class
Solution {
public
:
string intToRoman(
int
num) {
char
romanChar[] = {
'I'
,
'V'
,
'X'
,
'L'
,
'C'
,
'D'
,
'M'
};
string res;
int
i = 6, factor = 1000;
while
(num != 0)
{
helper(num / factor, &romanChar[i], res);
i -= 2;
num %= factor;
factor /= 10;
}
return
res;
}
void
helper(
int
k,
char
romanChar[], string &res)
{
// 0 <= k <= 9
if
(k <= 0);
else
if
(k <= 3)
res.append(k, romanChar[0]);
else
if
(k == 4)
{
res.push_back(romanChar[0]);
res.push_back(romanChar[1]);
}
else
if
(k <= 8)
{
res.push_back(romanChar[1]);
res.append(k-5, romanChar[0]);
}
else
if
(k == 9)
{
res.push_back(romanChar[0]);
res.push_back(romanChar[2]);
}
}
};
【著作権声明】転載は出典を明記してください:http://www.cnblogs.com/TenosDoIt/p/3793503.html