#每日一题#网易2016实习研发工程师笔试题

来源:互联网 发布:种子在线观看软件 编辑:程序博客网 时间:2024/06/10 06:28

      问题描述:有一个整数数组,请你根据快速排序的思路,找出数组中第k大的数。

          给定一个整数数组a,同时给定它的大小n和要找的k(k在1到n之间),请返回第k大的数,保证答案存在。

      测试样例:

          【1,3,5,2,2】,5,3

       返回:2

        根据题目的要求:我们利用快速排序的思路,递归时要对于k与i的值进行对比。

       下面给出具体的代码:

#include <stdio.h>#include <stdlib.h>#include <strings.h>//寻找第k大的数int quicksortk(int *a,int left,int right,int k){    int i = left;    int j = right;    int x = a[left];    if(left < right){        while(i < j){            for(;j > i && a[j] < x;j--);            if(j > i){                a[i++] = a[j];            }            for(;i < j && a[i] > x;i++);            if(i < j){               a[j--] = a[i];            }                 }        a[j] = x;        if(k == j){            return i;        }else if(k > j){            //右递归            quicksortk(a,j + 1,right,k);        }else{            //左递归            quicksortk(a,left,j - 1,k);        }            }}

测试程序:

int main(int argc,char**argv){    int n;    int *a = NULL;    int i;    int k;    int value;    while(1){        printf("请输入数组的长度n:(-1 quit)\n");        scanf("%d",&n);        if(n == -1){            printf("error!!\n");            exit(1);        }        a = (int *)malloc(sizeof(int) * n);        bzero(a,sizeof(int) * n);        printf("请输入数组元素:\n");        for(i = 0;i < n;i++){           scanf("%d",a + i);        }        printf("请输入k的值:\n");        scanf("%d",&k);        value = quicksortk(a,0,n - 1,k - 1);        printf("第%d大的数:%d\n",k,a[value]);        printf("\n");        free(a);    }    return 0;}

其执行结果:

    其实这样的笔试题算是比较基础的东西,革命尚未成功,同志仍需努力!!!! 在编程之美那本书上也有过类似的问题,只不过它要求寻找的是最大的k个数,在后面的博客中会对于这个问题进行具体的说明的。。。。

0 0
原创粉丝点击