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 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