歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 2012年華為校園招聘機試(武漢)

2012年華為校園招聘機試(武漢)

日期:2017/2/28 14:47:24   编辑:Linux教程

1:選秀節目打分,分為專家評委和大眾評委,score[]數組裡面存儲每個評委打的分數,judge_type[]裡存儲與score[]數組對應的評委類別,judge_type[i] == 1,表示專家評委,judge_type[i] == 2,表示大眾評委,n表示評委總數。打分規則如下:專家評委和大眾評委的分數分別取一個平均分(平均分取整),然後,總分 = 專家分*0.6 + 大眾評委*0.4,總分取整。如果沒有大眾評委,則總分 = 專家評委平均分,總分取整。函數最終返回選手得分。函數接口:

int cal_score(int score[],int judge_type[],int n)

解:此題較為簡單,遍歷一遍,即可

int cal_score(int score[],int judge_type[],int n)
{
int sumExpert=0,sumE=0,sumNormal=0,sumN=0;
for(int i=0;i<n;i++){
judge_type[i]==1?(sumExpert+=score[i],++sumE):(sumNormal+=score[i],++sumN);
}
return !sumNormal?sumExpert/sumE:(sumExpert/sumE*0.6+sumNormal/sumN*0.4);
}

2、給定一個數組input[] ,如果數組長度n為奇數,則將數組中最大的元素放到 output[] 數組最中間的位置,如果數組長度n為偶數,則將數組中最大的元素放到 output[] 數組中間兩個位置偏右的那個位置上,然後再按從大到小的順序,依次在第一個位置的兩邊,按照一左一右的順序,依次存放剩下的數。
例如:
input[] = {3, 6, 1, 9, 7}
output[] = {3, 7, 9, 6, 1};
input[] = {3, 6, 1, 9, 7, 8}
output[] = {1, 6, 8, 9, 7, 3}
函數接口如下:
void sort(int input[],int n, int output[]);

解,此題屬於基於算法,下面程序中使用一個STL算法,如果不使用,可使用簡單的選擇排序,冒泡排序等代替

#include<iostream>
#include<iterator>
#include<algorithm>
#include<functional>
using namespace std;
void sort(int input[],int n, int output[])
{
bool flag=false;//標志左右操作
int left=1,right=0;
for(int i=0;i<n;i++)
{
sort(input,input+n,less<int>());
if(flag&&(n/2-left)>=0)
output[n/2-(left++)]=input[n-i-1];
else if(!flag&&(n/2+right)<n)
output[n/2+(right++)]=input[n-i-1];
flag=!flag;
}
}

3、操作系統任務調度問題。操作系統任務分為系統任務和用戶任務兩種。其中,系統任務的優先級 <50,用戶任務的優先級>= 50且 <= 255。優先級大於255的為非法任務,應予以剔除。現有一任務隊列task[],長度為n,task中的元素值表示任務的優先級,數值越小,優先級越高。函數scheduler實現如下功能,將task[] 中的任務按照系統任務、用戶任務依次存放到 system_task[] 數組和 user_task[] 數組中(數組中元素的值是任務在task[] 數組中的下標),並且優先級高的任務排在前面,數組元素為-1表示結束。
例如:
task[] = {0,30,155,1,80,300,170,40,99}
system_task[] = {0, 3, 1, 7, -1}
user_task[] = {4, 8, 2, 6, -1}

函數接口

void scheduler(int task[], int n, int system_task[], int user_task[])

解:也是一道基本題,考思維嚴謹吧

void scheduler(int task[], int n, int system_task[], int user_task[])
{
int tmpS=0,tmpU=0;
for(int i=0;i<n;i++)//此方法效率不高,不想想了~~~
{
int tmp=-1;
if(task[i]>255||task[i]<0)
continue;//非法任務,跳過
for(int j=0;j<n;j++)
//求考虎優先級相等的情況,>=可以用來處理,但不穩定~~~~~~
//就寫到這了~~
if(task[i]<50&&task[i]>=task[j])
++tmp;
else if(task[i]>=50&&task[j]>=50&&task[i]>=task[j])
++tmp;
task[i]<50?(++tmpS,system_task[tmp]=i):(++tmpU,user_task[tmp]=i);//有點懶了,不想寫長了
}
}

Copyright © Linux教程網 All Rights Reserved