在这段代码中,我们如何获得数组中第二大的元素

时间:2018-11-26 20:49:18

标签: c# arrays

在下面的代码中,我们使用此arr [Array.IndexOf(arr,maxNum)] = 0;获得最大数; 但是我们没有做任何事情来获取第二大的数字,我们只是将maxNum更改为secondMaxnum,并在console.WriteLine中传递了secondMaxNum的参数,并获得了第二大的数字,任何人都可以解释这是怎么回事。

var arr = new int[] { 2, 9, 1, 4, 6 };

var maxNum = arr[0];
foreach (var item in arr)
{
    if (item > maxNum)
        maxNum = item;
}
arr[Array.IndexOf(arr, maxNum)] = 0;

var secondMaxNum = arr[0];
foreach (var item in arr)
{
    if (item > secondMaxNum)
        secondMaxNum = item;
}
Console.WriteLine(secondMaxNum);

3 个答案:

答案 0 :(得分:1)

两个循环基本上在做相同的事情,在数组中找到最大的数字。重要的是两个循环之间 发生了什么:

arr[Array.IndexOf(arr, maxNum)] = 0;

这实际上是将最大值设置为零,从而使其小于所有其他值。因此,以前的第二高现在是最高的。

当然,这仅适用于非常具体的数据。例如,如果数组中的所有数字均为负数,则将失败。


这也不是最有效的解决方案,因为它具有三个O(n)循环,两个显式for循环和IndexOf中的隐式循环。您最好在第一个循环中存储 index ,这样您根本不必使用IndexOf,就像这样:

var maxIdx = 0;
foreach (var i = 1; i < arr.Length; ++i)
    if (arr[i] > arr[maxIdx])
        maxIdx = i;
arr[maxIdx] = 0;

答案 1 :(得分:0)

您在两个循环中都做同样的事情。

在第一个循环之后,将最大数字的值设置为0。

因此,在第二眼中,您会得到最高的数字(在将最高数字设为0之前是第二高的数字)

答案 2 :(得分:0)

  

Array.IndexOf(arr,maxNum)

正在获取最大的9的索引,即索引1;

  

arr [1] = 0;

您正在将索引1的元素设置为值0;

var firstRun = new int[] { 2, 9, 1, 4, 6 };
var secondRun = new int[] { 2, 0, 1, 4, 6 };
相关问题