我有一个代表一个数字的字符串:
445123966682
在该数字中,有3个数字按升序排列:123 我想编写一个规则,检查我给它的任何数字字符串,看看是否有3个或更多的数字按升序或降序排列。
正确:445123或445987 错误:192837或97531
我认为最好的方法是使用RegEx检查,但我不是RegEx的最佳选择。我能想到的唯一另一个选择是迭代字符并检查或将数字转换为整数,并使用modulo + division从数字中取出每个数字并与系列中的下一个数字进行比较。
修改 对不起,我的意思是连续的订单。 123是有效的,135不是。
答案 0 :(得分:7)
使用正则表达式,这有点微不足道:
/012|123|234|345|456|567|678|789|987|876|765|654|543|432|321|210/
这是愚蠢的,但问题很简单,愚蠢的解决方案是最好的。
答案 1 :(得分:0)
我不太确定你可以在这里使用RegExp,因为问题可能会更复杂。您需要3个直接或相反的数字。看起来你可以有很多组合来加入正则表达式。
我建议设计一个简单的缓冲区和一个了望窗口。缓冲区大小可能等于了望窗口大小。您将一个符号放在缓冲区中并检查了下一个符号的了望窗口。您可以逐步增加此算法的复杂性,以记住地点,长度等。
答案 2 :(得分:0)
我认为这就是我解决问题的方法:
public bool TestForAscending()
{
var regex = new Regex(@"(\d)(?=(\d{2}))");
var target = "120847212340876";
var matches = regex.Matches(target);
List<string> groups = new List<string>();
foreach( Match m in matches )
{
groups.Add(m.Groups[1].Value + m.Groups[2].Value);
}
return groups.Any(x => IsAscending(x));
}
public static bool IsAscending(string x)
{
if (x.Length == 1)
{
return true;
}
int last = int.Parse(x.Last().ToString());
int prev = int.Parse(x[x.Length - 2].ToString());
return last == prev + 1 && IsAscending(x.Substring(0, x.Length - 1));
}
这里有一个正则表达式,它将返回目标字符串中的每3位数组(您可以通过调整正则表达式中的量词来更改要测试的连续位数)。这个正则表达式的结果是它打破了两组之间的对,所以要获得完整的数字,你必须连接第1组和第2组。但这很容易。之后,您只需编写一个小方法来测试数字是否在升序(我选择了递归)。