查找第二大数组
本文关键字:数组 查找 | 更新日期: 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)
最简单的算法(确保一切正常):
- 排序数组
- 循环最大值,直到找到一个较小的值。
但是让我们检查你的循环,使它工作。问题在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;
}