华为机试题目.docx

上传人:b****5 文档编号:7325487 上传时间:2023-01-23 格式:DOCX 页数:124 大小:122.60KB
下载 相关 举报
华为机试题目.docx_第1页
第1页 / 共124页
华为机试题目.docx_第2页
第2页 / 共124页
华为机试题目.docx_第3页
第3页 / 共124页
华为机试题目.docx_第4页
第4页 / 共124页
华为机试题目.docx_第5页
第5页 / 共124页
点击查看更多>>
下载资源
资源描述

华为机试题目.docx

《华为机试题目.docx》由会员分享,可在线阅读,更多相关《华为机试题目.docx(124页珍藏版)》请在冰豆网上搜索。

华为机试题目.docx

华为机试题目

华为机试题

【2011】

1、

(stdlib.h里面定义了五种类型、一些宏和通用工具函数。

类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t;宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等;常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit())

#include

#include

#include

#include

#defineLENGTH13

intverifyMsisdn(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

return2;

}

}

else

return3;

}

else

return1;

return0;

}

intmain()

{

char*pchar=NULL;

unsignedcharichar=0;

intresult;

switch(ichar)

{

case0:

pchar="8612345363789";break;

case1:

pchar="861111111111111";break;

case2:

pchar="86s1234536366";break;

default:

break;

}

result=verifyMsisdn(pchar);

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

}

华赛面试:

1.

charm[]={"I","LOVE","CHINA"}

char*p=m;

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

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

intmain()

{

doublex=1;

doubley;

y=x+3/2;

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

return0;

}//////结果为2.000000

3.

4.找错

unsignedintf()

{

unsignedchara=123;

unsignedcharres;

while(a-->=0)

{

res+=a;

}

returnres;

}//res没有初始化

5.

structnode

{

intdata;

node*pre;

node*next;

}

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

1.数组比较(20分)

•问题描述:

比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组

长度不等,则只比较较短长度数组个数元素。

请编程实现上述比较,并返回比较

中发现的不相等元素的个数

比如:

数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为0

数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为3

•要求实现函数:

intarray_compare(intlen1,intarray1[],intlen2,intarray2[])

【输入】intlen1:

输入被比较数组1的元素个数;

intarray1[]:

输入被比较数组1;

intlen2:

输入被比较数组2的元素个数;

intarray2[]:

输入被比较数组2;

【输出】无

【返回】不相等元素的个数,类型为int

•示例

1)输入:

intarray1[]={1,3,5},intlen1=3,

intarray2[]={77,21,1,3,5},intlen2=5

函数返回:

0

2)输入:

intarray1[]={1,3,5},intlen1=3,

intarray2[]={77,21,1,3,5,7},intlen2=6

函数返回:

#include

#include

#include

intarray_compare(intlen1,intarray1[],intlen2,intarray2[])

{

intcount=0;

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

{

if(array1[len1-1]!

=array2[len2-1])

{

count++;

}

}//蓝色字体部分也可以换成如下的代码if(array1[len1-1]==array2[len2-1])break;elsecount++;

returncount;

}

intmain()

{

intresult=0;

intarray1[]={1,3,5};

intlen1=3;

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

intlen2=5;

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

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

//函数形参

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

printf("theresultis%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。

•要求实现函数:

voidarray_iterate(intlen,intinput_array[],intm,intoutput_arra

y[])

【输入】intlen:

输入数列的长度;

intintput_array[]:

输入的初始数列

intm:

初始计数值

【输出】intoutput_array[]:

输出的数值出列顺序

【返回】无

•示例

输入:

intinput_array[]={3,1,2,4},intlen=4,m=7

输出:

output_array[]={2,3,1,4}

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

#include

#include

#include

typedefstructNode

{

intnum;

structNode*next;

}node;

node*creat(intlen,intinput_array[])

{

node*h,*p,*s;

inti;

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);

}

voidarray_iterate(intlen,intinput_array[],intm,intoutput_array[])

{

node*p,*q,*s;

inti=0,j=0,k;

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]=m;

k=j;

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

{

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

}

}

intmain()

{

intinput_array[]={3,1,2,4};

intlen=4;

intm=7;

intoutput_array[4];

array_iterate(len,input_array,m,output_array);

}

3.简单四则运算

•问题描述:

输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值

注:

1、表达式只含+,-,*,/四则运算符,不含括号

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

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

4、除法用整数除法,即仅保留除法运算结果的整数部分。

比如8/3=2。

输入表

达式保证无0作为除数情况发生

5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算

符字符,除此之外不含其它任何字符,不会出现计算溢出情况

•要求实现函数:

intcalculate(intlen,char*expStr)

【输入】intlen:

字符串长度;

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

inthuiwen(charstr[])

{

inti,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);

}

voidmain()

{

charstr[100]={0};

inti;

intlen;

printf("Inputastring:

");/*提示输入Inputastring:

*/

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即可,不需要再做其他合法性判断。

要求实现函数:

intsintverifyMsisdn(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、筛选出来的元音字母,不需要剔重;

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

要求实现函数:

voidsortVowel(char*input,char*output);

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

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

【返回】无

示例

输入:

char*input=“Abort!

MayBeSomeErrorsInOutSystem.“

输出:

char*output=“aeeeooAEIO“

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

问题描述:

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

1、长度为18位;

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

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

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

例如:

511002198808080111或511002198********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即可,不需要再做其他合法性判断。

要求实现函数:

intverifyIDCard(char*input)

示例

1)输入:

”511002111222”,函数返回值:

1;

2)输入:

”511002abc123456789”,函数返回值:

2;

3)输入:

”51100219880808123a”,函数返回值:

3;

4)输入:

”511002188********4”,函数返回值:

4;

5)输入:

”511002198********4”,函数返回值:

5;

6)输入:

”511002198********4”,函数返回值:

6;

7)输入:

”511002198902291234”,函数返回值:

7;

8)输入:

”511002198********4”,函数返回值:

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个元素输出,以此进行直到数组中的元素

全部输出

第一题【20分】:

鉴定回文数组。

第二题【30分】:

求两个整型数组的异集,即A+B-(A与B的交集)。

第三题【50分】:

判定德州扑克的牌型。

给5张牌,返回它的牌型,4个的,3

个+对子,顺子,3个+2个单张,2对,1对,其他。

【2012】

1、删除子串,只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数。

#include

#include

#include

#include

intdelete_sub_str(constchar*str,constchar*sub_str,char*result)

{

assert(str!

=NULL&&sub_str!

=NULL);

constchar*p,*q;

char*t,*temp;

p=str;

q=sub_str;

t=result;

intn,count=0;

n=strlen(q);

temp=(char*)malloc(n+1);

memset(temp,0x00,n+1);

while(*p)

{

memcpy(temp,p,n);

if(strcmp(temp,q)==0)

{

count++;

memset(temp,0x00,n+1);

p=p+n;

}

else

{

*t=*p;

p++;

t++;

memset(temp,0x00,n+1);

}

}

free(temp);

returncount;

}

intmain()

{

chars[100]={‘\0’};

intnum=delete_sub_str(“123abc12de234fg1hi34j123k”,”123”,s);

printf(“Thenumberofsub_stris%d\r\n”,num);

printf(“Theresultstringis%s\r\n”,s);

}

2、约瑟夫环是一个数学的应用问题:

已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。

从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

#include

#include

typedefstructNode

{

intnum;

structNode*next;

}LinkList;

LinkList*creat(intn)

{

LinkList*p,*q,*head;

inti=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;/*使链表尾指向链表头形成循环链表*/

returnhead;

}

voidfun(LinkList*L,intm)

{

inti;

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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1