如何在相隔10个元素的数组中查找重复项/重复项

时间:2018-12-21 05:27:16

标签: c#

我有一个如下数组: {1,5,5,4,5,6,7,8,9,10,11,12,13,14,1,16,17,5} 我想在每10个元素中找到一个重复的元素。

我需要一个代码,该代码可以告诉我5在10个元素内重复了3次(在5s(4)之间最多只有1个元素。由于距离太远,它应该倒数5个)。 10个元素内只有3个5)。 我不希望代码返回1,因为两个1之间有13个元素。

我有一个可以计算重复次数的代码,但是如何更改它以便可以计算包含10个元素的重复次数?

            var dict = new Dictionary<string, int>();
            foreach (var count in combined2)
            {
                if (dict.ContainsKey(count))
                    dict[count]++;
                else
                    dict[count] = 1;
            }
            foreach (var val in dict)
            {
                MessageBox.Show(val.Key + " occurred " + val.Value + " times");
            }

我只关注出现次数最多的重复项。如果某个数字重复两次,而另一个重复3次。我只想知道重复3次的号码(包含10个项目)。谢谢

4 个答案:

答案 0 :(得分:6)

  • 制作一个字典max默认为0
  • 制作一个字典seen默认为0
  • count0计数N,其中N是元素数。
  • N >= 10之后,递减seen[array[count - 10]]
  • 增量seen[array[count]]
  • 如果该数字大于max[array[count]],请对其进行更新
  • 重复
  • 返回max中最大值的键。

这样,seen始终在10个元素的窗口中具有准确的计数,而max将在10个元素的窗口中具有每个元素的最大出现次数。

答案 1 :(得分:1)

此代码在“数字”数组(n = 10个元素内)内找到出现次数更高的第一项:

int n = 10;
int[] numbers = new int[] {1,5,5,4,5,6,7,8,9,10,11,12,13,14,1,16,17,5};
int mostDuplicatedNumber = 0, numberOfMaxOccurrences = 0;

for(int count = 0; count < numbers.Length - n; count++)
{
    var groupOfNumbers = numbers.Skip(count).Take(n).GroupBy(i => i).OrderByDescending(i => i.Count());

    if(numberOfMaxOccurrences < groupOfNumbers.First().Count())
    {
        numberOfMaxOccurrences = groupOfNumbers.First().Count();
        mostDuplicatedNumber = groupOfNumbers.First().Key;
    }
}

Console.WriteLine("Most duplicated number is " + mostDuplicatedNumber + " with " + numberOfMaxOccurrences + " occurrences");

答案 2 :(得分:1)

尝试这种方式。我没有使用IDE进行测试,只是在旅行时写的。让我知道您是否遇到任何错误。它所做的只是简单地获取前10个元素并找到出现的次数,即重复,但是然后(您想显示出最重复的数字,在这种情况下,您必须将那些重复的数字保存在另一个数组中,并交换这些元素以获得最重复和最少重复的元素如您在问问题时所说的,我还没有实施这部分)。

         .................


     int[] inputArray= {1,5,5,4,5,6,7,8,9,10,11,12,13,14,1,16,17,5} // total input elements
         int[] mostAndLeastOccuranceArray=new int[10] ;


                   int skip=0;
                   int limit=10;
                   int[] resultArray=new int[10];
                    for (int i = skip; i < inputArray.Length; i++)   
                    {  
                        if(i<limit)
                       {
                       resultArray[i]=inputArray[i];
                       skip=skip+1;
                       }else
                        {
                          findOccurance(resultArray); // call in every 10 elements array subset
                    resultArray=new int[10]; // re-initialize the array 
                    limit=limit+10; // increase the limit for next iteration remember loop has not finished yet

                        } 

                    } 



    public void findOccurance(int[] resultArray)
    {
        var dict = new Dictionary < int,int > ();  
             foreach(var value in resultArray)  
             {  
                        if (dict.ContainsKey(value)) dict[value]++;  
                        else dict[value] = 1;  
              }

              foreach(var pair in dict)
              {
                       mostAndLeastOccuranceArray[pair.Key]=pair.Value; // store the repeated value
                       Console.WriteLine("Value {0} occurred {1} times", pair.Key, pair.Value);  

               }  
// call the method to find most and least occurance elements within each array subsets
findMostAndLeastOccuranceElements(mostAndLeastOccuranceArray)
// re-initialize 
 mostAndLeastOccuranceArray=new int[10] ;


    }

    public void findMostAndLeastOccuranceElements(int[] mostAndLeastOccuranceArray)
    {
     // now find most and least repeated elements within each 10 elements block

    }

答案 3 :(得分:1)

一个更简单的解决方案是使用LINQ。在这里,我编写了一种简单的方法来计算重复值的次数。

public int CountRepetitions(List<int> myLists,int maxValues,int number)
{
    if (myLists.Count > maxValues)
        return myLists.Take(maxValues).Count(v => v == number);
    else return 0;
}