学习C#,我试图找到用户插入列表中的第二大数组。我在网上找到了一个解决方案:
int second = int.MinValue;
foreach (int i in playerScore)
{
if (i > largest)
{
second = largest;
largest = i;
}
else if (i > second)
second = i;
}
但问题是,如果两个最大的数字相同,那么循环仍会吐出最大的数字。我无法想出一种编辑这个循环的方法,因此它会在我的数组中找到真正的第二高数字。像这样的循环是否是最有效的方法呢?
由于
答案 0 :(得分:2)
只需更改
else if (i > second)
到
else if (i > second && i != largest)
答案 1 :(得分:1)
最简单的算法(确保一切正常):
但是,让我们检查你的循环以使其正常工作。问题在于行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;
}
答案 2 :(得分:1)
您可以像这样使用linq
var secondHighest = playerScore.Distinct().OrderByDescending(a => a).Skip(1).First();
答案 3 :(得分:0)
您可以使用LINQ:
int second = playerScore.Distinct().OrderByDescending(x => x).Skip(1).First();
答案 4 :(得分:0)
您应该添加另一个条件:
if(i == largest) {
continue;
}
或者如果你想开始使用LINQ:
playerScore.Distinct().OrderByDescending(a => a).Take(2);
这将为您带来最大和第二大价值。
答案 5 :(得分:0)
您可以尝试这样做:创建一个辅助集合,接收原始集合,逐渐排序(有许多内置排序函数)并检索第二个元素。希望对你有用。
答案 6 :(得分:0)
如果你想获得列表中的第二大,你可以使用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();
答案 7 :(得分:0)
另一种方法是使用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;
}
这可以处理少于两个数字或最高数字不唯一的情况。
答案 8 :(得分:0)
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];
}
}
答案 9 :(得分:-1)
我喜欢这个简单的解决方案。不需要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;
}