罗马数字转整数

 题目;

罗马数字转整数_第1张图片

public class Solution 
{
    public int RomanToInt(string s) 
    {
        int number = 0;//number用于存储转换后的数字
        for(int i = 0;  i < s.Length;i++)
        {
            if(i + 1 != s.Length && s[i] == 'I' && s[i + 1] == 'V')//判断字符串中是否存在"IV"的情况
            {
                number += 4;
                i++;//索引后移一位,下面同理
            }
            else if(i + 1 != s.Length && s[i] == 'I' && s[i + 1] == 'X')//判断字符串中是否存在"IX"的情况
            {
                number += 9;
                i++;
            }
            else if(i + 1 != s.Length && s[i] == 'X' && s[i + 1] == 'C')//判断字符串中是否存在"XC"的情况
            {
                number += 90;
                i++;
            }
            else if(i + 1 != s.Length && s[i] == 'X' && s[i + 1] == 'L')//判断字符串中是否存在"XL"的情况
            {
                number += 40;
                i++;
            }
            else if(i + 1 != s.Length && s[i] == 'C' && s[i + 1] == 'D')//判断字符串中是否存在"CD"的情况
            {
                number += 400;
                i++;
            }
            else if(i + 1 != s.Length && s[i] == 'C' && s[i + 1] == 'M')//判断字符串中是否存在"CM"的情况
            {
                number += 900;
                i++;
            }
            else//当以上情况都不存在时就可以对单个字符进行解释
            {
                switch(s[i])
                {
                    case 'I':
                        number++;
                        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:
                        break;
                }
            }
        }
        return number;
    }
}

 思路:

首先,判断特殊的情况是转换的难点,由于特殊情况都是由两个字符组成,且相邻,所以可以使用数组的连续性来判断是否出现特殊情况,在这里需要注意,我们需要把特殊情况中的两个字符当成整体考虑,所以当出现特殊情况后,索引需要再往后移动一位,且还要判断索引是否超出边界,由于&&的阻断性,把判断越界的条件写在前面会比较好。

根据我长达两年半的思考,应该不可能出现像”IXC“这样的罗马数字,所以不用担心使用这种方法会存在遗漏.

你可能感兴趣的:(算法,c#,leetcode)