回 帖 发 新 帖 刷新版面

主题:第41次编程比赛之口水题

这个题目是半年前一个朋友去google面试时被问的一个题目, 我觉得与第39次比赛的第一题比较相似,所以称之为口水题

求一个自然数数组中最中间的那个数, 如果数组元素个数为偶数个,则求出从大到小第 n/2 个,  函数原型为
unsigned int Mid(unsigned int array[], unsigned int n);

例1
n = 5;  array = {6, 7, 8, 9, 10};
结果应该是8

例2
n = 4;  array = {2, 2, 3, 3};
结果应该是3
 
测试环境
    P3M 1.2G 640MB  
    visual studio 2002, release mode

    运行时间为10s, 数组长度最长为100M, 再大我的内存就不够了

本次比赛截止时间为星期六下午一点整,到时间后我会另开一贴供大家提交自己的测试数据, 到星期天晚上七点截止. 这些数据和我自己的数据都会被用来测试大家提交的程序.

回复列表 (共7个回复)

沙发

test

板凳

[quote]
则求出从大到小第 n/2 个
[/quote]

[quote]
例2
n = 4;  array = {2, 2, 3, 3};
结果应该是3
[/quote]


----------------------
从大到小第 n/2 个, array = {2, 2, 3, 3}; 
n = 4;
n/2 = 2;
从大到小第2个数,如果相同的只算一个数,那么是2 如果相同的数不只算一个数,则是3

请楼主清楚的说明.

3 楼

#include <stdio.h>
#include <stdlib.h>

int compare( const void *arg1, const void *arg2 );

unsigned int Mid(unsigned int array[], unsigned int n)
{
    int i;
    qsort((void*)array,n,sizeof(unsigned int),compare);
    i=n/2;
    return array[i];
}
int compare( const void *arg1, const void *arg2 )
{
    int *p1=(int*)arg1;
    int *p2=(int*)arg2;
    if(*p1>*p2)
        return 1;
    if(*p1<*p2)
        return -1;
    return 0;
}

4 楼

unsigned int Mid(unsigned int array[],unsigned int n)
{
    unsigned int N,i,j;
    N=n-1;
    for(i=0;i<n;++i)
    {
        
        for(j=0;j<N;++j)
        {
            Camp(array[j],array[j+1]);
        }
        N-=1;
    }
    if(n%2==0)return array[n/2-1];
    if(n%2==1)return array[n/2];
}

void Camp(unsigned int& a,unsigned int& b)
{
    unsigned int temp;
    if(a<b)
    {
        temp=a;
        a=b;
        b=temp;
    }

}

5 楼

#include<stdio.h>
#include<math.h>
#include<stdlib.h>

int sort_func( const void *a, const void *b) 

        if(*(unsigned int*)a>*(unsigned int*)b) 
                return 1; 
        else if(*(unsigned int*)a<*(unsigned int*)b) 
                return -1; 
        else 
                return 0; 
}
unsigned int Mid(unsigned int array[], unsigned int n)
{
    qsort((void*)array,n,sizeof(unsigned int),sort_func);
    return n%2?array[(n-1)/2]:array[n/2];
}

6 楼

#include <iostream>
using namespace std;
int cmp(const void *p1,const void *p2)
{
    unsigned int a=*(const int *)p1;
    unsigned int b=*(const int *)p2;
    if(a>b)
        return -1;
    else return 1;
}
unsigned int Mid(unsigned int array[], unsigned int n)
{
    if(1==n%2)    //引用题目“求一个自然数数组中最中间的那个数”
           return array[n/2];             //返回数组中间那个数
   /*引用题目“如果数组元素个数为偶数个,则求出从大到小第 n/2 个”*/
    else qsort(array,n,sizeof(int),*cmp);  //按从大到小排序
      return array[n/2-1];         //返回第n/2大的那个数
}
main()
{
    unsigned int arr[]={1,2,3,4,5,6};
    cout<<Mid(arr,6);
}

7 楼

已删!

我来回复

您尚未登录,请登录后再回复。点此登录或注册