寻找第二大阵列

时间:2014-08-19 12:12:44

标签: c# arrays

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

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

但问题是,如果两个最大的数字相同,那么循环仍会吐出最大的数字。我无法想出一种编辑这个循环的方法,因此它会在我的数组中找到真正的第二高数字。像这样的循环是否是最有效的方法呢?

由于

10 个答案:

答案 0 :(得分:2)

只需更改

else if (i > second)

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

答案 1 :(得分:1)

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

  1. 对数组进行排序
  2. 循环显示最大值,直到找到较小的值。
  3. 但是,让我们检查你的循环以使其正常工作。问题在于行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;
}