LeetCode第13題ローマ数字回転整数(Roman to Integer)

11970 ワード

文書ディレクトリ
  • タイトルアドレス
  • タイトル説明
  • コード実装
  • タイトルアドレス
    タイトルアドレスhttps://leetcode-cn.com/problems/roman-to-integer/
    タイトルの説明
    ローマ数字には、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.
    

    コード実装
    答えはhttps://leetcode-cn.com/problems/roman-to-integer/solution/hua-jie-suan-fa-13-luo-ma-shu-zi-zhuan-zheng-shu-b/
    構想
  • は、まず、すべての組合せ可能性をハッシュテーブルにリストし、追加する
  • はその後、文字列を巡回する.組み合わせは2つしかないため、1つは1文字、1つは2文字であり、そのうち2つの文字は1文字
  • より優先する.
  • は、2文字の組合せがハッシュテーブルに存在するか否かを判断し、存在する場合は結果ansに値を取り出し、2文字後ろにシフトする.存在しない場合は現在の1文字が存在するか否かを判断し、存在する場合は結果ansに値を取り出し、1文字
  • を後ろに移動する.
  • ループ終了戻り結果ans
  • コード#コード#
    Java
    class Solution {
        public int romanToInt(String s) {
            Map<String, Integer> map = new HashMap<>();
            map.put("I", 1);
            map.put("IV", 4);
            map.put("V", 5);
            map.put("IX", 9);
            map.put("X", 10);
            map.put("XL", 40);
            map.put("L", 50);
            map.put("XC", 90);
            map.put("C", 100);
            map.put("CD", 400);
            map.put("D", 500);
            map.put("CM", 900);
            map.put("M", 1000);
            
            int ans = 0;
            for(int i = 0;i < s.length();) {
                if(i + 1 < s.length() && map.containsKey(s.substring(i, i+2))) {
                    ans += map.get(s.substring(i, i+2));
                    i += 2;
                } else {
                    ans += map.get(s.substring(i, i+1));
                    i ++;
                }
            }
            return ans;
        }
    }