数组中的第三大元素

时间:2019-07-14 06:55:17

标签: c

有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]);
}

2 个答案:

答案 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();
}