一点一点前进...

0%

欧拉项目 | 89题 | 最简罗马数字

89题链接

这道题就是给了1k个罗马数字,让你求解一下,如果能写成最简形式,能节约多少个字符。
题中给出了提示,没有四个以上连续一样的,也就是说,不会出现10个I让你写成X或者9个I写成IX。

题目乍一看很唬人,仔细分析,能简写,无非就是应用减法,这篇文章给出了减法的规则,再加上提示的最多4个连续,那么,能简写的就无非下面6种情况:
DCCCC|LXXXX|VIIII|CCCC|XXXX|IIII
能够简写成
CM|XC|IX|CD|XL|IV

那么,代码就很简单了,找到这六种模式,然后替换简写完,算差值

1
2
3
4
5
6
7
8
9
public static int GetAnswer()
{
var words = input.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);

string pattern = "DCCCC|LXXXX|VIIII|CCCC|XXXX|IIII";
string replacement = "RR";

return words.Select(roman => roman.Length - Regex.Replace(roman, pattern, replacement).Length).Sum();
}

这里,替换的时候用了个小技巧,反正就是换成2个字符,也没有必要非要一一对应(当然,如果要输出简写,那么需要对应的替换),于是乎,给了RR两个字符,算是占位符了。