華爲三道上機題解答

       華爲今年筆試改爲上機了,自己上機試了下,題目雖然不難,但是編程也需要注意一些細節。首先,看到題目,不要急於下手寫代碼,要先問題看明白理解對,把思路理清楚,。題目轉自一個網友liuqiqi677:http://blog.csdn.net/liuqiqi677/article/details/6755498

       昨天去參加了華爲的校園招聘上機考試,題目一共三道,都比較簡單,不要求算法效率,也不要求對所給數據的合法性作檢測,主要還是注重基礎知識的考察,和大家分享一下,希望對接下來的同學有所幫助。

      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) 

      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[])

      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[])

解答:

#include <iostream>
#include <map>
#include <utility>
#define N 10
using namespace std;
//1
int cal_score(int score[],int judge_type[],int n)
{
	int avgz=0,avgd=0;
	int numz=0,numd=0;
	int i;
	for(i=0;i<n;i++)
	{
		if(1==judge_type[i])
		{
			numz++;
			avgz+=score[i];
		}
		if(2==judge_type[i])
		{
			numd++;
			avgd+=score[i];
		}
	}
	if(numd!=0)
	{
		return (int)( (avgz/numz)*0.6 + (avgz/numz)*0.4 ); 
	}
	else 
		return (int)(avgz/numz);
}
//2
void sort(int input[],int n,int output[])
{
	int i,j;
	//InsertSort
	for(i=1;i<n;i++)
	{
		int k=input[i];
		for(j=i;j>0 && k>input[j-1];j--)
				input[j]=input[j-1];
		input[j]=k;
	}
	//print
	for(i=0;i<n;i++)
		cout<<input[i]<<" ";
	cout<<endl;

	int mid=n/2;
	output[mid]=input[0];
	i=mid-1;
	j=mid+1;
	for(int k=1;k<n;k++)
	{
		if(k%2==1)
		{
			output[i]=input[k];
			i--;
		}
		else
		{
			output[j]=input[k];
			j++;
		}
	}
	//print
	for(i=0;i<n;i++)
		cout<<output[i]<<" ";
	cout<<endl;
}

//3
void scheduler(int task[],int n,int system_task[],int user_task[])
{
	map<int,int> temp;
	
	int i,j;
	for(i=0;i<n;i++)
		temp.insert(make_pair(task[i],i));
	map<int,int>::iterator iter=temp.begin();
	i=0;
	j=0;
	while(iter!=temp.end())
	{
		//cout<<iter->first<<" "<<iter->second<<" ";
		//++iter;
		if(iter->first<50)
			system_task[i++]=iter->second;
		if(iter->first>=50 && iter->first<=255)
			user_task[j++]=iter->second;
		++iter;
	}

	system_task[i]=-1;
	user_task[j]=-1;

	for(i=0;system_task[i]!=-1;i++)
		cout<<system_task[i]<<" ";
	cout<<endl;

	for(j=0;user_task[j]!=-1;j++)
		cout<<user_task[j]<<" ";
	cout<<endl;
}
int main()
{
	int score[N]={8,9,9,10,8,8,9,7,9,9};
	int judge_type[N]={1,1,2,2,1,2,2,2,2,2};
	int s=cal_score(score,judge_type,N);
	cout<<"score="<<s<<endl;

	//2
	int in1[5]={3,6,1,9,7};
	int out1[5];
	sort(in1,5,out1);
	int in2[6]={3,6,1,9,7,8};
	int out2[6];
	sort(in2,6,out2);

	//3
	int task[9]={0, 30, 155, 1, 80, 300, 170, 40, 99} ;
	int system_task[9];
	int user_task[9];
	scheduler(task,9,system_task,user_task);

	return 0;
}

編譯環境:VC6.0


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章