有6个测试用例,其中5个是正确的。 该程序即将找到第三大元素 在一个数组中。您能找到最后一个错误吗 测试用例可以通过?
#include<stdio.h>
void thirdLargest(int arr[],int arr_size);
int main()
{
int n,a[1000],i;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
thirdLargest(a,n);
return 0;
}
void thirdLargest(int arr[],int arr_size)
{
int i,j,temp;
for(i=0;i<arr_size-1;i++)
{
for(j=0;j<arr_size-i-1;j++)
{
if(arr[j]>arr[j+1])
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
printf("The third Largest element is %d",arr[arr_size-3]);
}
答案 0 :(得分:0)
为了好玩,我写了一段代码似乎可以解决您的问题,还有4、5级等等。此外,我还添加了在运行时计算随机数和/或管理级别值的功能。
您可能会获得除操纵2个预处理器宏之外的其他情况:
#define RAND_VALUE 0
0要求手动插入数字,1则计算随机数。
#define LEVEL 3
3用于管理案例,除0以外的其他值可以管理其他固定案例(第4、5,...,n级),0则用于管理动态分配,并且函数接收参数level
。
此代码不验证插入的数字是否小于值级别。这可能是个问题,应该以某种方式纠正。
另一种故障情况可能是插入了1000个以上的数字。同样,这种情况也应该以某种方式纠正。
代码在这里:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <malloc.h>
#include <limits.h>
#define LEVEL 3
#define RAND_VALUE 0
#ifndef LEVEL
int levelLargest(int * a, int len, unsigned int level);
#else
int levelLargest(int * a, int len);
#endif
#ifndef LEVEL
int levelLargest(int * a, int len, unsigned int level)
#else
int levelLargest(int * a, int len)
#endif
{
#if LEVEL == 0
int i,j,k,* max;
int l=(int)level;
max=malloc(level*sizeof(int));
#else
int i,j,k,max[LEVEL];
const int l=LEVEL;
#endif
for(i=0;i<l;i++)
max[i]=INT_MIN;
for(i=0;i<len;i++) {
for(j=0;j<l;j++) {
if (a[i]>max[j]) {
for(k=l-1;k>j;k--) {
max[k]=max[k-1];
}
max[j]=a[i];
break;
}
}
}
i=max[l-1];
#if LEVEL == 0
free(max);
#endif
return i;
}
int main()
{
int n,a[1000],i;
#if RAND_VALUE != 0
srand((unsigned)time(NULL));
#endif
scanf("%d",&n);
for(i=0;i<n;i++)
{
#if RAND_VALUE != 0
/* Computes numbers between +100 and -100 */
a[i]=rand() % 200 - 100;
printf("%+4d ",a[i]);
#else
scanf("%d",&a[i]);
#endif
}
#if RAND_VALUE != 0
puts("");
#endif
printf("The 3rd largest is: %d\n",
#if LEVEL == 0
levelLargest(a,n,3)
#else
levelLargest(a,n)
#endif
);
return 0;
}
P.S .:对于大级别(级别x),值可能最好使用qsort使用qsort对值进行降序排序,然后指示已排序数组的第x个元素。
答案 1 :(得分:0)
解决方案1:使用哈希处理
private static void ThirdLargestElement()
{
int[] arr = { 2, 4, 1, 3, 5 };
int third = GetThirdLargestElement(arr);
Console.WriteLine("Third element :{0}", third);
}
private static int GetThirdLargestElement(int[] arr)
{
HashSet<int> track = new HashSet<int>();
int size = arr.Length;
for (int i = 0; i < size; i++)
{
track.Add(arr[i]);
if (track.Count >= 3)
track.Remove(track.Min());
}
if (track.Count == 3)
return track.Min();
return track.Min();
}