我有一系列的整数。我想获得该数组中第二高的数字。有一个简单的方法吗?
答案 0 :(得分:16)
试试这个(使用LINQ):
int secondHighest = (from number in numbers
orderby number descending
select number).Skip(1).First();
答案 1 :(得分:15)
您可以对数组进行排序并在第二个索引处选择项目,但是下面的O(n)循环会更快。
int[] myArray = new int[] { 0, 1, 2, 3, 13, 8, 5 };
int largest = int.MinValue;
int second = int.MinValue;
foreach (int i in myArray)
{
if (i > largest)
{
second = largest;
largest = i;
}
else if (i > second)
second = i;
}
System.Console.WriteLine(second);
答案 2 :(得分:4)
是的,有2个变量(第一个和第二个)通过数组,每次与这两个单元格相符(总是先将最高位置放在第二位,最高位置排在第二位) 一次通过,你将获得第二个变量的第二高。
答案 3 :(得分:2)
您没有指定是否要以最低的复杂性执行此操作。
假设您的数组未排序,请参阅:How to find the kth largest element in an unsorted array of length n in O(n)?
在未排序的数组中查找第K个最大元素:在O(n)中构建最大堆。现在从堆中删除k个元素;其中每次删除都需要log(n)时间来维护堆。总时间复杂度= O(n + klogn)
要了解在O(n)中构建最大堆,请参阅Binary heap
答案 4 :(得分:1)
max1=0;
max2=0;
for( int i=0; i < a.Length; i++)
{
if (arr[i]> max1)
{
max2=max1;
max1=arr[i];
}
else
{
if (a[i]!= max1) && ( a[i] > max2)
max2[i]=arr[i];
}
}
答案 5 :(得分:1)
获取最大数量,一旦最大值被更改,请与第二个高数字进行比较,看是否需要交换。第二个if语句检查该值是否小于max并且大于第二个最大值。由于短路,如果第一个条件失败则退出if并跳过
static void Main(string[] args)
{
//int[] arr = new int[10] { 9, 4, 6, 2, 11, 100, 53, 23, 72, 81 };
int[] arr = { 1, 8, 4, 5, 12, 2, 5, 6, 7, 1, 90, 100, 56, 8, 34 };
int MaxNum = 0;
int SecNum = 0;
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] > MaxNum)
{
if (MaxNum > SecNum) { SecNum = MaxNum; }
MaxNum = arr[i];
}
if (arr[i] < MaxNum && arr[i] > SecNum)
{
SecNum = arr[i];
}
}
Console.WriteLine("Highest Num: {0}. Second Highest Num {1}.", MaxNum, SecNum);
Console.ReadLine();
}
答案 6 :(得分:0)
int[] myArray = new int[] { 0, 1, 2, 3, 13, 8, 5 };
int num1=0, temp=0;
for (int i = 0; i < myArray.Length; i++)
{
if (myArray[i] >= num1)
{
num1 = myArray[i];
}
else if ((myArray[i] < num1) && (myArray[i] > temp))
{
temp = myArray[i];
}
}
Console.WriteLine("The Largest Number is: " + num1);
Console.WriteLine("The Second Highest Number is: " + temp);
答案 7 :(得分:0)
int[] arr = { 1, 8, 4, 5, 12, 2, 5, 6, 7, 1, 90, 100, 56, 8, 34 };
int first, second;
// Assuming the array has at least one element:
first = second = arr[0];
for(int i = 1; i < arr.Length; ++i)
{
if (first < arr[i])
{
// 'first' now contains the 2nd largest number encountered thus far:
second = first;
first = arr[i];
}
}
MessageBox.Show(second.ToString());
答案 8 :(得分:0)
static void Main(string[] args)
{
int[] myArray = new int[] { 0, 1, 2, 3, 13, 8, 5,12,11,14 };
int num1 = 0, temp = 0;
for (int i = 0; i < myArray.Length; i++)
{
if (myArray[i] >= num1)
{
temp = num1;
num1 = myArray[i];
}
else if ((myArray[i] < num1) && (myArray[i] > temp))
{
temp = myArray[i];
}
}
Console.WriteLine("The Largest Number is: " + num1);
Console.WriteLine("The Second Highest Number is: " + temp);
Console.ReadKey();
}