华为校园招聘软件研发上机测试题及部分解答+

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

以下是收集到的两套题(没有添加答案),上机测试只有应聘软件研发的才会碰到。

有的写了点自己的解法,如果大家有好的想法欢迎讨论!大家一起学习嘛!
以下是上机考试的一些注意事项:
(1)考试时长为2个小时,总共有3个题(去年是2个题,难度要比今年大些),编译环境为VC 6.0(C语言)/ Eclipse(Java);
(2)3个题目中大致第一个题是最简单的,第三个题是最难的;
(3)从服务器上下载题目下来后最好能把工程保存到在电脑重启后不会自动还原的磁盘分区下面,这样不致由于各种意外因素电脑重启过后编的程序不会消失;
(4)不要改动所给函数的原型,可以自己添加函数。

另外,华为提供的工程是将Main函数隐藏了的,所以自己不用再添加Main函数。

试题1:2011.9.6 转载自:
/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)
(这个问题很简单,应该只是涉及了下double/int转换)
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[])
基本的方法:
1) 先进行排序,然后挨个放/也可以以2为间隔存放。

第一种方法的时间复杂度根据所选排序算法的不同而不同,空间复杂度为:n;
2) 第一次选出一个最大,放在相应位置;第二次取出剩余最大值,放相应位置;依次类推。

其中,选最大值可以使用最大堆方法来实现(注意,不是堆排序哦)
选择一种好的排序算法的话(比如快排),两者的时间复杂度是差不多的。

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[])
方法1:
先扫描一遍task,分别将任务放到system_task[]和user_task[];
用稳定的排序算法(比如插入排序、归并排序等)分别对system_task[]和
user_task[]进行排序;
方法2:
用稳定的排序算法先对task[]进行排序,然后再放到system_task[]和user_task[]中;
两种方法时间复杂度是相同的,但效率上第一种会高一些。

试题2:(转载自:/html/bcyy/c/201109093208.html)1. 数组比较(20分)
比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组个数元素。

请编程实现上述比较,并返回比较中发现的不相等元素的个数
比如:
数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为0
数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为3
要求实现函数:
int array_compare(int len1, int array1[], int len2, int array2[])
【输入】int len1:输入被比较数组1的元素个数;
int array1[]:输入被比较数组1;
int len2:输入被比较数组2的元素个数;
int array2[]:输入被比较数组2;
【输出】无
【返回】不相等元素的个数,类型为int
示例:
1)输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5},int len2 = 5
函数返回:0
2)输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5,7},int len2 = 6
函数返回:3
2. 约瑟夫问题
输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。

从数列首位置开始计数,计数到m后,将数列该位置数值替换
计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。

如果计数到达数列尾段,则返回数列首位置继续计数。

请编程实现上述计数过程,同时输出数值出列的顺序
比如:输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置)
第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数
第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数
第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数
最后一轮计数出列数字为4,计数过程完成。

输出数值出列顺序为:2,3,1,4。

要求实现函数:
void array_iterate(int len, int input_array[], int m, int output_array[])
【输入】int len:输入数列的长度;
int intput_array[]:输入的初始数列
int m:初始计数值
【输出】int output_array[]:输出的数值出列顺序
【返回】无
示例:
输入:int input_array[] = {3,1,2,4},int len = 4,m=7
输出:output_array[] = {2,3,1,4}
解题思路:
每次出列一个数值,需要对m、input_array、output_array、输出位置outPos、起始位置startPos进行更新;
对于输出位置outPos的计算是关键!通过分析可知,
outPos=(startPos+m-1)%num
代码实现:
view plaincopy to clipboard
1#include <stdio.h>
2
3void print_array(int len, int array[])
4{
5for(int i=0; i<len; i++)
6 printf("%d ", array[i]);
7 printf("\n");
8}
9
10//input_array:a[0]...a[len-1]
11void array_iterate(int len, int input_array[], int m, int output_array[])
12{
13int startPos=0;
14int outPos;
15int nIter=len-1;
16int num=len;
17for(; nIter>=0; nIter--)
18 {
19 outPos=(m+startPos-1)%num;
20 m=input_array[outPos];
21 startPos=outPos;
22 printf("outPos is %d, new m is %d\n", outPos, m);
23 output_array[len-nIter-1]=input_array[outPos];
24for(int i=outPos; i<num-1; i++)
25 input_array[i]=input_array[i+1];
26 num--;
27 print_array(num, input_array);
28 }
29}
30
31void main()
32{
33int input_array[]={3,1,2,4};
34int output_array[4]={0};
35 array_iterate(4, input_array, 7, output_array);
36 print_array(4, output_array);
37}
3. 简单四则运算
问题描述:
输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值注:
3.1、表达式只含+, -, *, / 四则运算符,不含括号
3.2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3.3、要考虑加减乘除按通常四则运算规定的计算优先级
3.4、除法用整数除法,即仅保留除法运算结果的整数部分。

比如8/3=2。

输入表达式保证无0作为除数情况发生
3.5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况
要求实现函数:
int calculate(int len,char *expStr)
【输入】int len: 字符串长度;
char *expStr: 表达式字符串;
【输出】无
【返回】计算结果
示例:
1)输入:char *expStr = “1+4*5-8/3”
函数返回:19
2)输入:char *expStr = “8/3*3”
函数返回:6
零散的收集(转自:/yuliu0552/article/details/6744618):1. 字符串提取数字
完成函数
void take_num(const char *strIn, int *n, unsigned int *outArray)
输入
strIn="ab00cd+123fght456-25 3.005fgh"
输出
n=6
outArray={ 0, 123, 456, 25, 3, 5 }
(不考虑小数:如3.005输出3和5)。

相关文档
最新文档