我正在寻找一种简单易用的方法,该方法允许我在数组中找到一对重复项并显示该对存在的索引号。
到目前为止,我只有可以使用的方法头和输出示例
int Duplicates (int[] testArray){
int[] testArray = {1,5,6,8,9,4,4,6,3,2};
}
我唯一想要返回的是相邻对的索引位置,即在这种情况下为 5,即 (4,4)。如果没有相邻的对,我也希望能够打印“没有找到重复的对”
任何人都可以帮助我开始,因为我不知道如何开始做这样的事情。
我正在寻找一种简单易用的方法,该方法允许我在数组中找到一对重复项并显示该对存在的索引号。
到目前为止,我只有可以使用的方法头和输出示例
int Duplicates (int[] testArray){
int[] testArray = {1,5,6,8,9,4,4,6,3,2};
}
我唯一想要返回的是相邻对的索引位置,即在这种情况下为 5,即 (4,4)。如果没有相邻的对,我也希望能够打印“没有找到重复的对”
任何人都可以帮助我开始,因为我不知道如何开始做这样的事情。
在此处尝试以下 Linq 查询演示
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);
在这个 LINQ 查询中我能想到的唯一缺点是它使用 -1 作为丢弃值。在索引的情况下它总是正确的,但我通常不建议这样做。它的作用是检查数组的下一个元素是否与当前元素相同,如果为 true,则返回当前索引,否则返回 -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();
分解问题时非常简单,您必须查看每个元素,然后将其与下一个元素进行比较。唯一的主要问题是如果将最后一个元素的索引与索引 + 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
}
}
}
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 增加一,直到它遍历整个数组。
在每一步,当前值将与前一个值进行检查。如果它们相同,则将此位置添加到输出中。然后前一个值变成最后一个当前值,循环继续。