如何在数组中查找重复的相邻对

时间:2012-12-30 15:38:11

标签: c# arrays algorithm linq duplicates

我希望编写一个简单易用的方法,允许我在数组中找到一对重复项,并显示该对存在的索引号。

到目前为止,我只使用方法标题和输出

的示例
int Duplicates (int[] testArray){

int[] testArray = {1,5,6,8,9,4,4,6,3,2};
}

我唯一希望返回的是相邻对的索引位置,即在这种情况下为5(4,4)。如果没有相邻的对,我也希望能够打印"找不到重复的对#34;

任何人都可以帮助我开始,因为我不知道怎么会开始做这样的事情。

4 个答案:

答案 0 :(得分:3)

尝试按照Linq查询Demo here

int[] testArray = {1,5,6,8,9,4,4,6,3,2};

var adjacentDuplicate = testArray
    .Skip(1)
    .Where((value,index) => value == testArray[index])
    .Distinct();

if (adjacentDuplicate.Any() )
{    
    // Print adjacentDuplicate
}
else
{
   // No duplicates found.
}

修改

以下是重复索引的LINQ查询。

var adjacentIndex = testArray
    .Skip(1)
    .Select((value,index) => value == testArray[index] ? index : -1)
    .Where (x=> x!= -1);

答案 1 :(得分:1)

我在这个LINQ查询中可以想到的唯一缺点是它使用-1作为废弃值。如果是索引,它总是正确的,但我通常不建议这样做。它的作用是检查数组的下一个元素是否与当前元素相同,如果为真则返回当前索引,否则返回-1,然后仅选择大于零的索引。

int[] testArray = {1, 5, 6, 8, 9, 4, 4, 6, 3, 2, 2};
var duplicateIndexes = testArray.
            Select((value, index) => testArray.Length > index + 1 &&
                                     testArray[index + 1] == value ? index : -1).
            Where(index => index > 0).
            ToArray();

答案 2 :(得分:0)

当您解决问题时非常简单,您必须查看每个元素,然后将其与下一个元素进行比较。唯一的主要问题是,如果将最后一个元素的索引与索引+ 1进行比较,则会耗尽数组,这将导致数组超出范围异常,这就是我们检查位置的原因

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Misc
{
    class Program
    {
        static int duplicates(int[] array)
        {
            for (int i = 0; i < array.Length-1; i++)
            {
                if (array[i] == array[i+1])
                {
                    return i;
                }
            }
            return -1;
        }

        static void Main(string[] args)
        {
            int[] testArray = { 1, 5, 6, 8, 9, 4, 4, 6, 3, 2 };
            Console.WriteLine(duplicates(testArray));
            Console.ReadKey(); // block 
        }
    }
}

答案 3 :(得分:-1)

int previousValue = -1; //set it to something you're not expecting

for (int i=0; i <testArray.Count; i++) {
    int currentValue = testArray[i];

    if (currentValue.equals(previousValue) {
      //we have a duplicate
       duplicateList.add(i); //for the position of the duplicate
    }
    previousValue = currentValue;
}

if (duplicateList.Count == 0) {
   //no duplicates found
} else {
   return duplicateList.toArray();
}

解释 - 我们将通过逐个浏览它们来解决这个问题。

for循环每次都会将值i递增1,直到它遍历整个数组。

在每个步骤中,将使用之前的值检查当前值。如果它们相同,则将此位置添加到输出中。然后前一个值成为最后一个当前值,循环继续。