1

我有一些用 1 和 0 填充的数组。有没有简单的方法可以找到,例如,10 个彼此相邻且值为 1 的字段?

类似于: if (array[i ... i+10] = 1) -> 做一些事情?

我知道我可以用for它来做,但我有一个巨大的多重数组,这将非常有帮助。

4

2 回答 2

7

您可以使用 for 循环轻松完成此操作:

int c = 0;
for (int i = 0; i < myArray.Length; i++)
{
    c = (myArray[i] == 1) ? c + 1 : 0;
    if (c >= 10)
    {
        // do stuff
    }
}

这是使用 Linq 的另一种方式:

var indexes =
    from i in Enumerable.Range(0, myArray.Length - 10)
    where myArray.Skip(i).Take(10).All(x => x == 1)
    select i;
foreach(var i in indexes)
{
    // do stuff
}

这将返回该索引myArray处的元素和下一个 9 个索引处的元素都等于 1 的所有索引。但是,此方法比简单的 for 循环效率稍低,因为它可能会多次检查每个项目。

如果您喜欢流利的语法:

var indexes = Enumerable.Range(0, myArray.Length - 10)
                        .Where(i => myArray.Skip(i).Take(10).All(x => x == 1));
foreach(var i in indexes)
{
    // do stuff
}
于 2013-06-02T15:09:40.000 回答
1

如果我理解你的问题是正确的,你想做一些叫做模式匹配的事情。

那里有很多算法。第一个起点是这里的这个页面

从算法来看,Turbo-Boyer-Moore 是表现最好的一种。

但是你也可以用数据结构来处理这个问题,比如后缀树: 参见这篇关于后缀树的文章(或简称为 Trie)

这是 Boyer-Moore 算法Codeproject 关于 Boyer-Moore 的文章的实现

于 2013-06-02T16:44:59.373 回答