LeetCodeローマ数字回転整数-C++

2382 ワード

ローマ数字には、I、V、X、L、C、D、Mの7文字が含まれています.
              
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つの場合にのみ適用されます.
  • Iは、V(5)およびX(10)の左側に配置され、4および9を表すことができる.
  • Xは、L(50)およびC(100)の左側に配置され、40および90を表すことができる.
  • Cは、D(500)およびM(1000)の左側に配置され、400および900を表すことができる.ローマ数字を指定し、整数に変換します.入力は1~3999の範囲であることを確認します.

  • 例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.
    

    難点は、数字を減らす必要がある場合、例えばIV5-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%のユーザーを破った