?题目;
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“这样的罗马数字,所以不用担心使用这种方法会存在遗漏.