【力扣13】罗马数字转整数

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

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

暴力解法 

 public int RomanToInt(string s)
        {
            int sum = 0;
            for(int i = 0; i < s.Length; i++)
            {
                switch(s[i]){
                    case 'I':
                        if (i != s.Length - 1 && s[i + 1] == 'V')
                        {
                            sum += 4;
                            i++;
                        }else if(i != s.Length - 1 && s[i + 1] == 'X')
                        {
                            sum += 9;
                            i++;
                        }
                        else
                        {
                            sum++;
                        }
                        break;
                    case 'V':
                        sum += 5;
                        break;
                    case 'X':
                        if (i != s.Length - 1 && s[i + 1] == 'L')
                        {
                            sum += 40;
                            i++;
                        }
                        else if (i != s.Length - 1 && s[i + 1] == 'C')
                        {
                            sum += 90;
                            i++;
                        }
                        else
                        {
                            sum+=10;
                        }
                        break;
                    case 'L':
                        sum += 50;
                        break;
                    case 'C':
                        if (i != s.Length - 1 && s[i + 1] == 'D')
                        {
                            sum += 400;
                            i++;
                        }
                        else if (i != s.Length - 1 && s[i + 1] == 'M')
                        {
                            sum += 900;
                            i++;
                        }
                        else
                        {
                            sum+=100;
                        }
                        break;
                    case 'D':
                        sum += 500;
                        break;
                    case 'M':
                        sum += 1000;
                        break;
                    default:
                        Console.WriteLine("输入无效");
                        break;

                }

            }
            return sum;
        }

使用哈希表(但是内存消耗并没有减少,执行用时反而长了很多)

public int RomanToInt1(string s)
        {
            int sum = 0;
            Hashtable ht = new Hashtable();
            ht.Add("I", 1);
            ht.Add("V", 5);
            ht.Add("X", 10);
            ht.Add("L", 50);
            ht.Add("C", 100);
            ht.Add("D", 500);
            ht.Add("M", 1000);
            ht.Add("IX", 9);
            ht.Add("IV", 4);
            ht.Add("XL", 40);
            ht.Add("XC", 90);
            ht.Add("CD", 400);
            ht.Add("CM", 900);
            for(int i = 0; i < s.Length; i++)
            {
                if (i + 1 < s.Length && ht.Contains(s.Substring(i, 2)))
                {
                    sum += (int)ht[s.Substring(i, 2)];
                    i++;
                }
                else
                    sum += (int)ht[s.Substring(i, 1)];
            }
            return sum;
}

题解中看到的大佬暴力解法  依次判断 特殊情况使用减法

原文地址:https://www.cnblogs.com/h-jang/p/11812334.html