查找第二大数组

本文关键字:数组 查找 | 更新日期: 2023-09-27 18:18:51

学习c#,我试图在用户插入的列表中找到第二大数组。我在网上找到了一个解决方案:

int second = int.MinValue;
foreach (int i in playerScore)
{
    if (i > largest)
    {
        second = largest;
        largest = i;
    }
    else if (i > second)
        second = i;
}

但问题是,如果两个最大的数相同,循环仍然吐出最大的数。我想不出编辑这个循环的方法让它找到数组中第二高的数。这样的循环是最有效的方法吗?

谢谢

查找第二大数组

直接修改

else if (i > second)

else if (i > second && i != largest)

最简单的算法(确保一切正常):

  1. 排序数组
  2. 循环最大值,直到找到一个较小的值。

但是让我们检查你的循环,使它工作。问题在else if (i > second),因为如果i==largest是真的。我们把它改成else if (i > second && i<largest)

完整代码为:

int second = int.MinValue;
foreach (int i in playerScore)
{
    if (i > largest)
    {
        second = largest;
        largest = i;
    }
    else if (i > second && i<largest)
        second = i;
}

你可以这样使用linq

var secondHighest = playerScore.Distinct().OrderByDescending(a => a).Skip(1).First();

您可以使用LINQ:

    int second = playerScore.Distinct().OrderByDescending(x => x).Skip(1).First();

你应该再添加一个条件:

if(i == largest) {
   continue;
}

或者如果你想开始使用LINQ:

playerScore.Distinct().OrderByDescending(a => a).Take(2);

您可以尝试这样做:创建一个辅助集合,接收原始集合,对其进行递减排序(有许多内置排序函数)并检索第二个元素。

如果您想获得列表中的第二大,您可以使用LINQ(正如许多人已经建议的那样)。因为你想要第二个最大的数(与最大的数出现的次数无关),你可以这样做:

// sort decending: from the biggest to the smallest
var sorted = y.OrderByDescending(x => x);
// take the first element (which is the biggest)
var largest = sorted.First();
// exclude the biggest element from the list and take the first one now (which will be the second biggest)
var secondLargest = sorted.Where(x => x != largest).First();

另一种方法是使用我经常喜欢的LINQ来增加可读性。

但问题是,如果两个最大的数相同,则循环仍然吐出最大的数字

然后你可以按数字排序数组和分组:

var secondGroup = playerScore
    .OrderByDescending(i => i)    // orders highest first
    .GroupBy(i => i)              // builds groups of unique numbers
    .Skip(1)                      // you don't want the highest
    .FirstOrDefault();            // get the second highest, if there is a second
if (secondGroup != null)
{
    int second = secondGroup.Key;
}

处理少于两个数字或最大的数字不是唯一的情况。

int[] a=new int{1,2,3,4};
int firstbig=a[0];
int secondbig=a[1];
int p;
for(int i=0;i<a.length;i++)
 {
   if(firstbig<a[i])
     {
       firstbig=a[i];
       p=i;
     }
 }
for(int j=0;j<a.length;j++)
 {
  if(secondbig<a[j] && j!=p)
    {
     secondbig=a[j];
    }
 }

我喜欢这个简单的解决方案。不需要LINQ:

public static int FindSecondHighest(int [] ints)
{
    // assumptions:
    // minimum two ints in the array
    // they're not all equal
    // they're not negative
    var highest = 0;
    var secondHighest = 0;
    foreach (int x in ints)
    {
        if (x >= highest)
        {
            secondHighest = highest;
            highest = x;
        }
    }
    return secondHighest;
}