leetcodeローマ数字と整数の変換アルゴリズム


テーマの出典
https://leetcode.com/problems/roman-to-integer/
https://leetcode.com/problems/integer-to-roman/
ローマ数字と整数の相互回転を実現します.数値サイズは[1,3999]です.
ローマ数字
アルファベット
ローマ数字は7文字しかありません.各アルファベットコードの字は以下の通りです.
文字
M
D
C
L
X
V
I
代表数字
1000
500
100
50
10
5
1
4つのルール
  • 同じ数字が連続して書かれており、表示される数はこれらの数字が加算された数に等しい.XXX表示30
  • の小さい数字は大きい数字の右側にあり、表す数はこれらの数字を加算した数に等しいVIIIは8
  • を表す.
  • の小さい数字(I,X,Cに限る)は大きい数字の左側にあり、表す数は大きい数から小さい数を引くことに等しい:IVは4
  • を表す.
  • は1つの数の上に横線を引いて、この数が1000倍になることを示しています(テーマは4000以内の数しか考えていないので、このルールは考えなくてもいいです).

  • 5つのグループ数ルール
  • I,X,C:最大3個まで連用できますが、大きな数の左側に置くと1個しか使えません.
  • V,L,D:大きな数の左側に置くことはできず、1つしか使用できません.
  • IはVとXの左側にしか使えません.IVは4、IXは9
  • XはL,Cの左側にしか置けません.XLは40、XCは90
  • CはD,Mの左側にしか使えません.CDは400、CMは900
  • ぶんせき
    この中に面倒な点があります.数字は左にも右にも置けます.それは処理ロジックがそんなに順調ではありません.
    どちらも右側にしか置けない場合は、そのまま加算を使うことができます.9がIXである、VIIIIであれば加算処理OK. 
    整数回転ローマ数字について:組合せ数字を使用して分割することができ、プログラムが連結を実現できる方法.
    ローマ数字の回転整数:大きな数の左側に置かれた数字で、現在のアルファベットをプラスするかマイナスするかを判断するには、1つの特徴しか使用できません.
    コード#コード#
    整数からローマ数字へ
    string intToRoman(int num) { 
            if(num <= 0) return "";
            string ret = "";
            static int number[13] = {1000, 900, 500, 400, 100,90, 50, 40, 10, 9, 5, 4, 1};
            static string flags[13] = {"M","CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
            
            for(int i = 0; i < 13 && num > 0; i++){ 
                if(num < number[i]) continue;
                // cout<< i << " " << number[i] << " - " <= number[i]){
                    num-= number[i];
                    ret += flags[i];
                }
                
            }
            return ret; 
        }

    ローマ数字回転整数
    int romanToInt(string s) {
            int tagVal[256];
            tagVal['I'] = 1;
            tagVal['V'] = 5;
            tagVal['X'] = 10;
            tagVal['C'] = 100;
            tagVal['M'] = 1000;
            tagVal['L'] = 50;
            tagVal['D'] = 500;
            int val = 0;
            for(int i = 0; i < s.length(); i++){
                if(i+1 >= s.length() || tagVal[s[i+1]] <= tagVal[s[i]])
                    val += tagVal[s[i]];
                else
                    val -= tagVal[s[i]]; 
            }
            return val; 
        }