C# 字符串内计数的简洁解决方案

C# 字符串内计数的简洁解决方案,c#,string,C#,String,我试图解决以下问题,但找不到一个优雅的解决方案。有什么想法吗? 谢谢 输入-长度可变的数字字符串,例如。, 字符串str=555747637420211037355111201 任务-从左到右检查忽略重复的每个数字是否未出现在以下2个索引中。使用上面的例子,第一个数字=5。忽略重复,我们可以看到组中最后一个索引5是2。所以我们检查下两个索引,即3和4不应该有5。如果是这样,我们将其视为错误。目标是统计字符串中的此类错误 在上面的字符串中,错误出现在索引3、10和16处。一个简单的索引for循环,

我试图解决以下问题,但找不到一个优雅的解决方案。有什么想法吗? 谢谢

输入-长度可变的数字字符串,例如。, 字符串str=555747637420211037355111201

任务-从左到右检查忽略重复的每个数字是否未出现在以下2个索引中。使用上面的例子,第一个数字=5。忽略重复,我们可以看到组中最后一个索引5是2。所以我们检查下两个索引,即3和4不应该有5。如果是这样,我们将其视为错误。目标是统计字符串中的此类错误


在上面的字符串中,错误出现在索引3、10和16处。

一个简单的索引for循环,带有两个前瞻性检查,以确定是否可行。您可以将字符串视为char[]或IEnumerable—无论哪种方式,您都可以使用它来循环所有字符,并执行前瞻性检查,以查看以下一个或两个字符是否重复。

简单的索引for循环和两个前瞻性检查是否可行。您可以将字符串视为char[]或IEnumerable-无论哪种方式,您都可以使用它来循环所有字符并执行前瞻检查,以查看以下一个或两个字符是否重复。

除了其他优秀的解决方案外,您还可以使用简单的regexp:

foreach (Match m in Regexp.Matches(str, @"(\d)(?!\1)(?=\d\1)"))
    Console.WriteLine("Error: " + m.Index);
返回3,10,16。这将使用带反向引用的前向查找匹配相邻错误。处理重复。net应该支持这一点。如果不是,则可以使用非反向引用版本:


除了其他优秀的解决方案外,您还可以使用简单的regexp:

foreach (Match m in Regexp.Matches(str, @"(\d)(?!\1)(?=\d\1)"))
    Console.WriteLine("Error: " + m.Index);
返回3,10,16。这将使用带反向引用的前向查找匹配相邻错误。处理重复。net应该支持这一点。如果不是,则可以使用非反向引用版本:


对不起,不是C语言的人,但这里有一个简单的Ruby解决方案:

a="5557476374202110373551116201"
0.upto(a.length) do |i|
  puts "error at #{i}" if a[i]!=a[i+1] && a[i]==a[i+2]
end
输出:

error at 3
error at 10
error at 16

抱歉,不是C语言的人,但这里有一个简单的Ruby解决方案:

a="5557476374202110373551116201"
0.upto(a.length) do |i|
  puts "error at #{i}" if a[i]!=a[i+1] && a[i]==a[i+2]
end
输出:

error at 3
error at 10
error at 16

下面是我用C语言编写的一些东西,它与问题的示例输入一起工作。不过我还没有彻底检查过

public static IEnumerable<int> GetErrorIndices(string text) {
    if (string.IsNullOrEmpty(text))
        yield break;

    int i = 0;
    while (i < text.Length) {
        char c = text[i];

        // get the index of the next character that isn't a repetition
        int nextIndex = i + 1;
        while (nextIndex < text.Length && text[nextIndex] == c)
            nextIndex++;

        // if we've reached the end of the string, there's no error
        if (nextIndex + 1 >= text.Length)
            break;

        // we actually only care about text[nextIndex + 1],
        // NOT text[nextIndex] ... why? because text[nextIndex]
        // CAN'T be a repetition (we already skipped to the first
        // non-repetition)
        if (text[nextIndex + 1] == c)
            yield return i;

        i = nextIndex;
    }

    yield break;
}

下面是我用C语言编写的一些东西,它与问题的示例输入一起工作。不过我还没有彻底检查过

public static IEnumerable<int> GetErrorIndices(string text) {
    if (string.IsNullOrEmpty(text))
        yield break;

    int i = 0;
    while (i < text.Length) {
        char c = text[i];

        // get the index of the next character that isn't a repetition
        int nextIndex = i + 1;
        while (nextIndex < text.Length && text[nextIndex] == c)
            nextIndex++;

        // if we've reached the end of the string, there's no error
        if (nextIndex + 1 >= text.Length)
            break;

        // we actually only care about text[nextIndex + 1],
        // NOT text[nextIndex] ... why? because text[nextIndex]
        // CAN'T be a repetition (we already skipped to the first
        // non-repetition)
        if (text[nextIndex + 1] == c)
            yield return i;

        i = nextIndex;
    }

    yield break;
}

等等,你刚才说重复应该被忽略,那么索引3怎么会有错误呢?这是一个家庭作业问题吗?另外,如果第三个职位的分数是5,那么它不就是小组的一部分吗?这没有任何意义。他从0开始编号。所以在索引3中是7,而在索引5中又出现了7,这是一个错误。@danben,Dav:我认为它是这样工作的:555747637。。。真的是5747637。。。因为我们忽略了相邻的重复。现在很明显,索引3中的7是一个错误,因为索引1中已经有了一个7,距离上次出现7的时间不到两个索引。等等,你刚才说应该忽略重复,那么索引3中怎么会有错误?嗯?这是一个家庭作业问题吗?另外,如果第三个职位的分数是5,那么它不就是小组的一部分吗?这没有任何意义。他从0开始编号。所以在索引3中是7,而在索引5中又出现了7,这是一个错误。@danben,Dav:我认为它是这样工作的:555747637。。。真的是5747637。。。因为我们忽略了相邻的重复。现在很明显,索引3中的7是一个错误,因为索引1中已经有一个7,它在上次出现7的两个索引内。