leetcode 13ローマ数字回転整数C言語

6918 ワード

leetcode 13ローマ数字回転整数
原題
ローマ数字には、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.
出典:力ボタン(LeetCode)
リンク:https://leetcode-cn.com/problems/roman-to-integer/.
考え方:
  • IV,IX,XL,XC,CD,CM,これらの特殊な組み合わせが持つ最も簡単な法則は,いずれも2つのアルファベットからなり,前のアルファベットが後のアルファベットより
  • 小さい値を表すことである.
  • add関数は、アルファベットを対応する数値に対応する
  • である.
  • その後、左から右に順番にアルファベットを読み取る、前のアルファベットが表す値が後のアルファベットより小さい場合、特殊な組合せ
  • が現れる.
    コード#コード#
    int add(char a){
        int s=0;
        if(a=='I')
            s++;
        else if(a=='V')
            s+=5;
        else if(a=='X')
            s+=10;
        else if(a=='L')
            s+=50;
        else if(a=='C')
            s+=100;
        else if(a=='D')
            s+=500;
        else if(a=='M')
            s+=1000;
        return s;
    }
    int romanToInt(char * s){
        int sum=0;
        for(int i=0;i<strlen(s);i++){
            if(add(s[i])<add(s[i+1])){
                sum-=add(s[i]);
                i++;
            }
            sum+=add(s[i]);
            }
        return sum;
    }