当前位置:文档之家› 2011年华为校园招聘软件研发上机测试题汇总

2011年华为校园招聘软件研发上机测试题汇总

.

重庆_软研_sT(83656621) 16:31:33

数据结构的题

写函数,

VC6

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

#include

#include

typedef struct Node

{

int num;

struct Node *next;

}LinkList;

LinkList *creat(int n)

{

LinkList *p,*q,*head;

int i=1;

p=(LinkList *)malloc(sizeof(LinkList));

p->num=i;

head=p;

for(i=2;i<=n;i++)

{

q=(LinkList *)malloc(sizeof(LinkList));

q->num=i;

p->next=q;

p=q;

}

p->next=head; /*使链表尾指向链表头形成循环链表*/

return head;

}

void fun(LinkList *L,int m)

{

int i;

LinkList *p,*s,*q;

p=L;

printf("出列顺序为:");

while(p->next!=p)

{

for(i=1;i

{ q=p;

p=p->next;

}

printf("%5d",p->num);

s=p;

q->next=p->next;

p=p->next;

free(s);

}

printf("%5d\n",p->num); }

int main()

{

LinkList *L;

int n, m;

n=9;

m=5;

L=creat(n);

fun(L,m);

return 0;

}

#include

#include

#include

#include

#define LENGTH 13

int verifyMsisdn(char *inMsisdn)

{

char *pchar=NULL;

assert(inMsisdn!=NULL);

if(LENGTH==strlen(inMsisdn))

{

if(('8'==*inMsisdn)&&(*(inMsisdn+1)=='6'))

{

while(*inMsisdn!='\0')

{

if((*inMsisdn>='0')&&(*inMsisdn<='9'))

inMsisdn++;

else

return 2 ;

}

}

else

return 3;

}

else

return 1;

return 0;

}

int main()

{

char *pchar=NULL;

unsigned char ichar=0;

int result;

switch(ichar)

{

case 0:

pchar="8612345363789";break;

case 1:

pchar="861111111111111";break;

case 2:

pchar="86s1234536366"; break;

default:

break;

}

result =verifyMsisdn(pchar);

printf("result is %d\n",result);

}

华赛面试:

首先自我介绍,然后将自己的项目,然后拿出笔试题来让你做。

1.

char m[]={"I", "LOVE", "CHINA"}

char* p=m;

printf("%s", *p++);

printf("%c", **p);

int main()

{

double x=1;

double y;

y=x+3/2;

printf("%f\n",y);

return 0;

} ////// 2.0

2.x=0x??

求~x !x

3.

4.找错

unsigned int f()

{

unsigned char a=123;

unsigned char res;

while(a-->=0)

{

res+=a;

}

return res;

}

5.

struct node

{

int data;

node* pre;

node* next;

}

结构体数组转双向循环链表

群面:

12个人分两组,

介绍自己,

全部介绍完,抓几个人评价别的某个人

对10个按重要性排序

公司前景,个人兴趣,薪酬,工作地点,父母期望,解决户口,就业政策。

10分钟讨论

组长汇报排序结果

谁贡献最多,排序

2011年华为软件校园招聘编程测验

类别:软件C/C++语言

编程题(共3题,第一题20分,第二题30分,第三题50分,共100分)

注意:

1、请上机编写程序,按题目要求提交文件。[详见考试说明,点击进入考试说明]

2、本试题采用自动执行测试用例进行评分,测试用例不对考生公开

3、评卷通过在给定用例输入下,严格按照试题要求比较考生实现函数的输出与预设输出。两者相同则得分,不同则不得分。

4、评卷人保证测试用例输入参数的合法性,考生不用考虑输入参数非法或异常的情况

5、评卷人保证测试用例输入在被测函数正常合法情况下使用不会导致程序错误

6、如果考生函数异常导致程序崩溃或死循环,则自动评卷可能会被人为终止,剩余用例不被执行,无法得分

7、基于上述阅卷规则,请考生严格按照题目要求功能实现程序,尽量保证实现函数的稳健性,同时建议完成一道题并调试保证正确性后,再考虑并实现下一题目

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

#include

#include

#include

int array_compare(int len1, int array1[], int len2, int array2[]) {

int count=0;

for( ;len1>=0&&len2>=0 ;len1--,len2--)

{

if(array1[len1-1]==array2[len2-1])

{

count++;

}

}

return count;

}

int main()

{

int result=0;

int array1[]={1,3,5};

int len1=3;

int array2[]={77,12,1,3,5};

int len2=5;

result=array_compare( len1, array1, len2, array2);

///result=array_compare( len1, array1[], len2, array2[]);不能这样

// 函数形参中永远只是传得首地址,不能传数组切记切记!!!!!!

printf("the result is %d", result);

}

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

【输入】 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}

////////////循环链表实现//////////////////////

#include

#include

#include

typedef struct Node

{

int num;

struct node *next;

} node;

node *creat(int len , int input_array[])

{

node *h,*s,*p;

int i;

h=(node*)malloc(sizeof(node));

h->num=input_array[0];

p=h;

for(i=1;i

{

s=(node*)malloc(sizeof(node));

s->num=input_array[i];

p->next=s;

p=s;

}

p->next=h;

return (h);

}

void array_iterate(int len, int input_array[], int m) {

node *q,*p,*s;

int i=0,j=0,k;

int output_array[4];

p=creat(len,input_array);

while(p->next!=p)

{

for(i=1;i

{

q=p;

p=p->next;

}

m=p->num;

printf("%5d",m);

output_array[j++]=m;

s=p;

q->next=p->next;

p=p->next;

free(s);

s=NULL;

}

m=p->num;

printf("%5d\n",m);

output_array[j]=p->num;

k=j;

for(j=0 ; j<=k; j++)

{

printf("%5d",output_array[j]);

}

}

int main()

{

int input_array[]={3,1,2,4};

int len=4;

int m=7;

int output_array[4];

array_iterate(len, input_array, m, output_array);

}

3. 简单四则运算

? 问题描述:

输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值注: 1、表达式只含 +, -, *, / 四则运算符,不含括号

2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况

3、要考虑加减乘除按通常四则运算规定的计算优先级

4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生

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

第六题:类似昨天Sara说的最后一题:

给你一个数组a[],数组长度len 以及一个整数m

从数组中第一个数字数起找到第m个数字输出a[m] 然后再将a[m]赋值给m,从数组的下一个元素数起,找到第m个元素输出,以此进行直到数组中的元素全部输出

第五题:一副牌中发五张扑克牌给你:让你判断数字的组成:

有以下几种情况:

1:四条:即四张一样数值的牌(牌均不论花色)

2:三条带一对

3:三条带两张不相同数值的牌

4:两对

5:顺子包括 10,J,Q,K,A

6:什么都不是

7:只有一对

第一题:比较一个数组的元素是否为回文数组

#include

#include

int huiwen(char str[])

{

int i,len,k=1;

len=strlen(str);

for(i=0;i

{

if(str[i]!=str[len-i-1])

{

k=1;

break;

}

}

if(k==0)

printf("%s 不是一个回文数\n",str);

else

printf("%s 是一个回文数\n",str);

}

void main()

{

char str[100] = {0};

int i;

int len;

printf("Input a string:"); /*提示输入Input a string:*/ scanf("%s", str); /*scan()函数输入一个字符串:*/

huiwen(str);

}

第二题:求两个数组的和差就是去掉两个数组中相同的元素然后将两个数组中的元素存放在一个新的数组中切数组A中元素要在B数组元素之前

第三题:比较汗求简单的四则运算

参与运算的数字只有0--9

逆序单链表

第一题【20分】:鉴定回文数组。

第二题【30分】:求两个整型数组的异集,即A+B-(A与B的交集)。

第三题【50分】:判定德州扑克的牌型。给5张牌,返回它的牌型,4个的,3个+对子,顺子,3个+2个单张,2对,1对,其他。

上午是输入一个数组,然后找出哪个比平均值大

上午是输入一个数组,然后找出哪个比平均值大

1. 手机号码合法性判断(20分)

问题描述:

我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下:

1、长度13位;

2、以86的国家码打头;

3、手机号码的每一位都是数字。

请实现手机号码合法性判断的函数要求:

1)如果手机号码合法,返回0;

2)如果手机号码长度不合法,返回1

3)如果手机号码中包含非数字的字符,返回2;

4)如果手机号码不是以86打头的,返回3;

【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。

要求实现函数:

int s int verifyMsisdn(char* inMsisdn)

【输入】 char* inMsisdn,表示输入的手机号码字符串。

【输出】无

【返回】判断的结果,类型为int。

示例

输入: inMsisdn = “869123456789“

输出:无

返回: 1

输入: inMsisdn = “88139123456789“

输出:无

返回: 3

输入: inMsisdn = “86139123456789“

输出:无

返回: 0

2. 将一个字符串的元音字母复制到另一个字符串,并排序(30分)

问题描述:

有一字符串,里面可能包含英文字母(大写、小写)、数字、特殊字符,现在需要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序)。

说明:

1、元音字母是a,e,i,o,u,A,E,I,O,U。

2、筛选出来的元音字母,不需要剔重;

最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序。

要求实现函数:

void sortVowel (char* input, char* output);

【输入】 char* input,表示输入的字符串

【输出】 char* output,排好序之后的元音字符串。

【返回】无

示例

输入:char *input = “Abort!May Be Some Errors In Out System. “

输出:char *output =“aeeeooAEIO “

3. 身份证号码合法性判断

问题描述:

我国公民的身份证号码特点如下:

1、长度为18位;

2、第1~17位只能为数字;

3、第18位可以是数字或者小写英文字母x。

4、身份证号码的第7~14位表示持有人生日的年、月、日信息。

例如:511002 19880808 0111或511002 198********x。

请实现身份证号码合法性判断的函数。除满足以上要求外,需要对持有人生日的年、月、日信息进行校验。年份大于等于1900年,小于等于2100年。需要考虑闰年、大小月的情况。所谓闰年,能被4整除且不能被100整除或能被400整除的年份,闰年的2月份为29天,非闰年的2月份为28天。其他情况的合法性校验,考生不用考虑。

函数返回值:

1)如果身份证号合法,返回0;

2)如果身份证号长度不合法,返回1;

3)如果身份证号第1~17位含有非数字的字符,返回2;

4)如果身份证号第18位既不是数字也不是英文小写字母x,返回3;

5)如果身份证号的年信息非法,返回4;

6)如果身份证号的月信息非法,返回5;

7)如果身份证号的日信息非法,返回6(请注意闰年的情况);

【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。

要求实现函数:

int verifyIDCard(char* input)

示例

1)输入:”511002 111222”,函数返回值:1;

2)输入:”511002 abc123456789”,函数返回值:2;

3)输入:”511002 198********a”,函数返回值:3;

4)输入:”511002 188808081234”,函数返回值:4;

5)输入:”511002 198813081234”,函数返回值:5;

6)输入:”511002 198808321234”,函数返回值:6;

7)输入:”511002 1989 0229 1234”,函数返回值:7;

8)输入:”511002 198808081234”,函数返回值:0;

第一个:比较两个数组的元素是否相同

从后向前比较,直到比较完较短的一个数组为止。出现不同元素就返回0相同则返回1

第二题:比较一个数组的元素是否为回文数组

第三题:求两个数组的和差就是去掉两个数组中相同的元素然后将两个数组中的元素存放在一个新的数组中切数组A中元素要在B数组元素之前

第四题:比较汗求简单的四则运算

第五题:一副牌中发五张扑克牌给你:让你判断数字的组成:

有以下几种情况:

1:四条:即四张一样数值的牌(牌均不论花色)

2:三条带一对

3:三条带两张不相同数值的牌

4:两对

5:顺子包括 10,J,Q,K,A

6:什么都不是

第六题:类似昨天Sara说的最后一题:

给你一个数组a[],数组长度len 以及一个整数m

从数组中第一个数字数起找到第m个数字输出a[m] 然后再将a[m]赋值给m,从数组的下一个元素数起,找到第m个元素输出,以此进行直到数组中的元素全部输出

华为上机题:

1)天大:

上午是输入一个数组,然后找出哪个比平均值大

下午是链表的reverse

2)四川大学:

刚考完,都是编程题,不难挺基本的。数组比较,约瑟夫环,字符串计算

3)

第一题【20分】:鉴定回文数组。

第二题【30分】:求两个整型数组的异集,即A+B-(A与B的交集)。

第三题【50分】:判定德州扑克的牌型。给5张牌,返回它的牌型,4个的,3个+对子,顺子,3个+2个单张,2对,1对,其他。

算法都不难,关键看细心度啦。祝各位好运!

4)

昨天去参加了华为的校园招聘上机考试,题目一共三道,都比较简单,不要求算法效率,也不要求对所给数据的合法性作检测,主要还是注重基础知识的考察,和大家分享一下,希望对接下来的同学有所帮助。

1、选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数,judge_type[] 里存储与 score[] 数组对应的评委类别,

judge_type == 1,表示专家评委,judge_type == 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_t ask[])

相关主题
文本预览
相关文档 最新文档