public class Solution
    {
        private int ChangeToInt(char c)
        {
            var number = 0;
            string s = c.ToString();
            switch (s)
            {
                case "I":
                    number = 1;
                    break;
                case "V":
                    number = 5;
                    break;
                case "X":
                    number = 10;
                    break;
                case "L":
                    number = 50;
                    break;
                case "C":
                    number = 100;
                    break;
                case "D":
                    number = 500;
                    break;
                case "M":
                    number = 1000;
                    break;
                default:
                    number = 0;
                    break;
            }
            return number;
        }

        private int[] CalculateRange(int num)
        {
            int[] ary = new int[2];
            if (num == 1)
            {
                ary[0] = 1;
                ary[1] = 10;
            }
            else if (num == 5)
            {
                ary[0] = 1;
                ary[1] = 10;
            }
            else if (num == 10)
            {
                ary[0] = 1;
                ary[1] = 100;
            }
            else if (num == 50)
            {
                ary[0] = 10;
                ary[1] = 100;
            }
            else if (num == 100)
            {
                ary[0] = 10;
                ary[1] = 1000;
            }
            else if (num == 500)
            {
                ary[0] = 100;
                ary[1] = 1000;
            }
            else if (num == 1000)
            {
                ary[0] = 100;
                ary[1] = 1000;
            }

            return ary;
        }

        public int RomanToInt(string s)
        {
            //重复数次:一个罗马数字重复几次,就表示这个数的几倍。 
            //右加左减:在一个较大的罗马数字的右边记上一个较小的罗马数字,表示大数字加小数字。
            //在一个较大的数字的左边记上一个较小的罗马数字,表示大数字减小数字。
            //但是,左减不能跨越等级。比如,99不可以用IC表示,用XCIX表示。 
            //加线乘千:在一个罗马数字的上方加上一条横线或者在右下方写M,表示将这个数字乘以1000,即是原数的1000倍。
            //同理,如果上方有两条横线,即是原数的1000000倍。 
            //单位限制:同样单位只能出现3次,如40不能表示为XXXX,而要表示为XL。

            var list = new List<int>();//用于存放每组的初始数据
            var list2 = new List<int>();//用于存放每组的计算结果,用于最终计算
            var lastnum = 0;
            for (int i = 0; i < s.Length; i++)
            {
                var c = s[i];
                var num = ChangeToInt(c);
                if (lastnum == 0)//存储第一个值
                {
                    lastnum = num;
                    list.Add(num);
                }
                else//第一个值之后的值
                {
                    if (num <= lastnum)//当前的值,比之前的值小,可以放在右边
                    {
                        //list中的值可以放入list2
                        lastnum = num;
                        var partsum = 0;
                        for (int j = 0; j < list.Count; j++)
                        {
                            partsum += list[j];
                        }
                        list2.Add(partsum);

                        list.Clear();
                        list.Add(num);

                    }
                    else
                    {
                        //出现了左小,进行减法
                        var partsum = 0;
                        for (int j = 0; j < list.Count; j++)
                        {
                            partsum += list[j];
                        }
                        partsum = num - partsum;
                        list.Clear();
                        list.Add(partsum);
                        lastnum = partsum;
                    }
                }
            }

            if (list.Any())//处理最后一部分的值
            {
                var partsum = 0;
                for (int j = 0; j < list.Count; j++)
                {
                    partsum += list[j];
                }
                list2.Add(partsum);
                list.Clear();
            }

            var result = 0;
            foreach (var d in list2)
            {
                result += d;
            }
            Console.WriteLine(result);
            return result;
        }
    }

https://leetcode.com/problems/roman-to-integer/#/description

 

补充python的实现,抓住了规律很巧妙:

 1 class Solution:
 2     def romanToInt(self, s: str) -> int:
 3         dict = {'I':1,'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
 4         n= len(s)
 5         sum = 0
 6         for i in range(n-1):
 7             if dict[s[i]] < dict[s[i+1]]:
 8                 sum -= dict[s[i]]
 9             else:
10                 sum += dict[s[i]]
11         return sum + dict[s[-1]]

 

posted on 2017-04-19 11:24  Sempron2800+  阅读(147)  评论(0编辑  收藏  举报