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