2012年华为校园招聘机试(成都)


1:去掉一个数组里的最大值与最小值,求数组元素的平均值。函数接口为:float avescore(float score[] ,int n)解析:此题比较简单,循环一遍,记下数组的最大值与最小值以及总和,然后在求的总和里面减掉最大值与最小值,再求平均数即可,时间复杂度为O(n),代码不多,如下有两种解法

解法一:

float avescore(float score[] ,int n)
{
    float max=0,min=score[0],sum=0;
    for(int i=0;i<n;i++)
    {
        sum+=score[i];
        max=max<score[i]?score[i]:max;
        min=min>score[i]?score[i]:min;
    }
    return (sum-max-min)/(n-2);
}

解法二<STL解决>

#include<iostream>
#include<algorithm>
#include<numeric>
using namespace std;
float avescore(float score[] ,int n)
{
 float max=*max_element(score,score+n);
 float min=*min_element(score,score+n);
 return (accumulate(score,score+n,0.0)-max-min)/(n-2);
}

2: 对一个数组,将数组中偶数从大到小排序,奇数从小到大排序,奇数和偶数交叉着放且输出数组第一位放奇数  若奇数和偶数不等长,则把剩下的直接放到数组中。

函数接口为:void sortArray(int a[],int n)

解析,本题思路先遍历一遍数组,得出数组中的奇数个数与偶数个数,根据奇偶个数分别开辟空间再使用泛型算法对两个数组进行排序,奇数数组根据题意应该从小到大排序,偶数数组应是从大到小进行排序,再将排好序的数组根据题意要求重新赋值到原数组里,算法的空间复杂度O(n),不是很好的一个算法,开辟的空间要记得回收

#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
void sortArray(int score[] ,int n)
{
    int maxO=0,maxE=0,oIndex=0,eIndex=0;
    int *od=0,*ev=0;
    for(int i=0;i<n;i++)
        score[i]%2==0?++maxE:++maxO;
    od=new int[maxO];
    ev=new int[maxE];
    for(int j=0;j<n;j++)
        score[j]%2==0?ev[eIndex++]=score[j]:od[oIndex++]=score[j];
 sort(od,od+maxO,less<int>());
 sort(ev,ev+maxE,greater<int>());
    oIndex=eIndex=0;
    for(int k=0;k<n;k++)
        if((k%2==0&&oIndex<maxO)||(k%2!=0&&eIndex>=maxE))
            score[k]=od[oIndex++];
        else if((k%2!=0&&eIndex<maxE)||(k%2==0&&oIndex>=maxO))
            score[k]=ev[eIndex++];
    free(od);
    free(ev);
}

相关内容

    暂无相关文章