检查数字中的数字是否按升序排列

时间:2011-06-12 14:58:05

标签: c# .net regex validation

我有一个代表一个数字的字符串:

445123966682

在该数字中,有3个数字按升序排列:123 我想编写一个规则,检查我给它的任何数字字符串,看看是否有3个或更多的数字按升序或降序排列。

正确:445123或445987 错误:192837或97531

我认为最好的方法是使用RegEx检查,但我不是RegEx的最佳选择。我能想到的唯一另一个选择是迭代字符并检查或将数字转换为整数,并使用modulo + division从数字中取出每个数字并与系列中的下一个数字进行比较。

修改 对不起,我的意思是连续的订单。 123是有效的,135不是。

3 个答案:

答案 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组。但这很容易。之后,您只需编写一个小方法来测试数字是否在升序(我选择了递归)。