在下面的代码中,我们使用此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);
答案 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 };