在数据中,有时同一产品会以罗马数字命名,而有时则为数字。
示例 Samsung Galaxy SII
对比 Samsung Galaxy S2
如何将 II
转换为值 2
?
最佳答案
我注意到这里有一些非常复杂的解决方案,但这是一个非常简单的问题。我做了一个解决方案,避免了对“异常”(IV、IX、XL 等)进行硬编码的需要。我使用 for
循环来查看罗马数字字符串中的下一个字符,以查看是否应将与该数字关联的数字减去或添加到总数中。为简单起见,我假设所有输入均有效。
private static Dictionary<char, int> RomanMap = new Dictionary<char, int>()
{
{'I', 1},
{'V', 5},
{'X', 10},
{'L', 50},
{'C', 100},
{'D', 500},
{'M', 1000}
};
public static int RomanToInteger(string roman)
{
int number = 0;
for (int i = 0; i < roman.Length; i++)
{
if (i + 1 < roman.Length && RomanMap[roman[i]] < RomanMap[roman[i + 1]])
{
number -= RomanMap[roman[i]];
}
else
{
number += RomanMap[roman[i]];
}
}
return number;
}
我最初尝试在字符串上使用 foreach
,我认为这是一个稍微更具可读性的解决方案,但我最终将每个数字相加并在后来证明它是其中之一时减去它两次异常(exception),我不喜欢。为了后代,我还是会把它贴在这里。
public static int RomanToInteger(string roman)
{
int number = 0;
char previousChar = roman[0];
foreach(char currentChar in roman)
{
number += RomanMap[currentChar];
if(RomanMap[previousChar] < RomanMap[currentChar])
{
number -= RomanMap[previousChar] * 2;
}
previousChar = currentChar;
}
return number;
}
关于c# - 罗马数字到整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14900228/