华为校招2013-2016年机试题目-个人整理.docx_第1页
华为校招2013-2016年机试题目-个人整理.docx_第2页
华为校招2013-2016年机试题目-个人整理.docx_第3页
华为校招2013-2016年机试题目-个人整理.docx_第4页
华为校招2013-2016年机试题目-个人整理.docx_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2016校招机试题第一题输入一串用空格隔开的数字串,对于数字串的奇数位按升序排序,偶数位按降序排序示例输入:4 6 2 3 7 8 1处理过程:奇数位:4268升序排序结果:2468偶数位:6371 降序排序结果:7631结果输出:2 7 4 6 6 3 8 1#include #include #includevoid sort(char input, int n, char output);void main()char input1=4 6 2 3 6 7 8 1;char output116;int m=15;sort(input1,m,output1);for(int i=0;im;i+)printf(%c ,output1i);printf(n); void sort(char input,int n,char output)int i,j,t1,t2,t=0;int *b=(int *)malloc(sizeof(int)*n);int *c=(int *)malloc(sizeof(int)*n);b0=input0-0;for(i=4,t1=1;in;i+=4,t1+) for(j=t1-1;(inputi-0)=0);j-)bj+1=bj;bj+1=inputi-0;c0=input2-0;for(i=6,t2=1;icj)&(j=0);j-)cj+1=cj;cj+1=inputi-0;for(i=0,j=0;in;i+=4,j+)outputi=bj+0;outputi+1= ;outputi+2=cj+0;outputi+3= ;2.精灵王子爱好冒险,在一次探险历程中,他进入了一个神秘的山洞。在洞穴深处,精灵王子不小心触动了洞穴内暗藏的机关,整个洞穴将很快塌陷,精灵王子必须尽快逃离洞穴。精灵王子的跑步速度为17m/s,以这样的速度可能是无法逃出洞穴的。庆幸的是精灵王子拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗法值10点。精灵王子的魔法值恢复的速度为4点/s,只能在原地休息状态时才能恢复。现在已知精灵王子的魔法初值m,他所在洞穴中的位置与洞穴出口之间的距离s,距离洞穴塌陷的时间t. 你的任务是写一个程序帮助精灵王子计算如何在最短时间内逃离洞穴。若能逃出,输出“yes”,并输出逃出所用的最短时间;若不能逃出,则输出”no“,同时输出精灵王子在剩下的时间内能走的最远距离。注意字母大小写。注意精灵王子跑步,闪烁或休息活动均以秒(s)为单位。且每次活动的持续时间为整数秒。距离的单位为米(m)。注:m,s,t均是大于等于0的整数。由输入保证取值合法性,考生不用检查。提醒:如果输入的s为0,则说明本身已经在出口,输出应为:yes 0如果输入的t为0(且s不为0),则说明已经没有时间了,输出应为:no 0输入格式:mst输出格式:yes 逃出洞穴所用时间或no在洞穴塌陷前能逃跑的最远距离10#includevoid main()int m,s,t;int de1=0,de2=0;int start=t;scanf(%d %d %d,&m,&s,&t);if(s=0)printf(yes 0n);elseif(t=0)printf(no 0n);elsewhile(t)t-;if(m=10)m-=10;de1+=60;else m+=4;de2+=17;if(de2s)printf(yes %dn,start-t);break;elseprintf(no %dn,de2);break;2015校招机试题第一题(60分):按要求分解字符串,输入两个数m,n;m代表输入的m串字符串,n代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”#include#includevoid main()int m,n,i,j,p=0;char str1024;int a10;scanf(%d%d,&m,&n);printf(please input %d string:n,m);for(i=0;im;i+)scanf(%s,&strp);ai=strlen(str+p);p=p+ai;p=0;for(i=0;im;i+) if(ain)for(j=p;jp+ai;j+)printf(%c,strj);for(j=ai;jn;j+)printf(0);printf(n);else if(ai=n)for(j=p;jp+ai;j+)printf(%c,strj);printf(n);elsefor(j=p;jn+p;j+)printf(%c,strj);printf(n);for(j=n+p;jai+p;j+)printf(%c,strj);for(j=0;j(2*n-ai);j+)printf(0);printf(n);p=p+ai;第一题:拼音转数字输入是一个只包含拼音的字符串,请输出对应的数字序列。转换关系如下:描述: 拼音yi er san si wu liu qi ba jiu 阿拉伯数字1 2 3 4 5 6 7 8 9输入字符只包含小写字母,所有字符都可以正好匹配运行时间限制:无限制内存限制: 无限制输入: 一行字符串,长度小于1000输出: 一行字符(数字)串样例输入: yiersansi样例输出: 1234#include#includevoid main()int i,j;char str1000;char ch;scanf(%s,str);int len=strlen(str);for(i=0;ilen;)switch (stri)case y: printf(1);i=i+2;break;case e:printf(2);i=i+2;break;case s:if(stri+1=a)printf(3);i=i+3;elseprintf(4);i=i+2;break;case w:printf(5);i=i+2;break;case l:printf(6);i=i+3;break;case q:printf(7);i=i+2;break;case b:printf(8);i=i+2;break;case j:printf(9);i=i+3;break;default:break;第二题:去除重复字符并排序运行时间限制:无限制内容限制: 无限制输入: 字符串输出: 去除重复字符并排序的字符串样例输入: aabcdefff样例输出: abcdef#include#include#includevoid solve(char *str , int len) int i,hash256; memset(hash,0,sizeof(hash); for(i=0;ilen;+i) if(0=hashstri) hashstri=1; for(i=0;i256;+i) if(0!=hashi) putchar(i); printf(n);int main(void) int len; char str1000; while(scanf(%s , str) != eof) len = strlen(str); solve(str , len); return 0;第三题:等式变换输入一个正整数x,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。1 2 3 4 5 6 7 8 9 = x比如:12-34+5-67+89 = 51+23+4-5+6-7-8-9 = 5请编写程序,统计满足输入整数的所有整数个数。输入: 正整数,等式右边的数字输出: 使该等式成立的个数样例输入:5样例输出:21#include#includeint ops21;const char sym3=+,-, ;int result,num;void dfs(int layer,int currentresult,int lastop,int lastsum)lastsum*=(layer9)?100:10; lastsum+=layer; if(layer=9)currentresult+=(lastop)?(-1*lastsum):lastsum;if(currentresult=result)+num;printf(1);for(int i=2;i=9;+i)if(symopsi-1!= )printf( %c , symopsi-1);printf(%d,i);printf(=%dn,result);return;opslayer=2;dfs(layer+1,currentresult,lastop,lastsum); /continuecurrentresult+=(lastop)?(-1*lastsum):lastsum;opslayer=0;dfs(layer+1,currentresult,0,0); /plusopslayer=1;dfs(layer+1,currentresult,1,0); /minusvoid main()while(scanf(%d, &result)!=eof)num=0;dfs(1,0,0,0);printf(%dn,num);2014校招机试题一、题目描述(60分):通过键盘输入一串小写字母(az)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。比如字符串“abacacde”过滤结果为“abcde”。要求实现函数:void stringfilter(const char *pinputstr, long linputlen, char *poutputstr);#include#includevoid stringfilter(const char *pinputstr, long linputlen, char *poutputstr);void main()char str100;char sr100;scanf(%s,str);int len=strlen(str);stringfilter(str,len,sr);printf(%sn,sr);void stringfilter(const char *pinputstr, long linputlen, char *poutputstr)int i,j;int m=0;char hash256;memset(hash,0,256);for(i=0;ilinputlen;i+)if(hashpinputstri=0)hashpinputstri=1;poutputstrm=pinputstri;m+;poutputstrm=0;二、题目描述(40分):通过键盘输入一串小写字母(az)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。压缩规则:1、仅压缩连续重复出现的字符。比如字符串abcbc由于无连续重复字符,压缩后的字符串还是abcbc。2、压缩字段的格式为字符重复的次数+字符。例如:字符串xxxyyyyyyz压缩后就成为3x6yz。要求实现函数:void stringzip(const char *pinputstr, long linputlen, char *poutputstr);【输入】 pinputstr: 输入字符串 linputlen: 输入字符串长度【输出】 poutputstr: 输出字符串,空间已经开辟好,与输入字符串等长;【注意】只需要完成该函数功能算法,中间不需要有任何io的输入输出示例输入:“cccddecc” 输出:“3c2de2c”输入:“adef” 输出:“adef”输入:“pppppppp” 输出:“8p”#include#includevoid stringzip(const char *pinputstr,long linputlen,char *poutputstr);void main()int i,j;char str256;char sr256;scanf(%s,str);int len=strlen(str);stringzip(str,len,sr);printf(%sn,sr);void stringzip(const char *pinputstr,long linputlen,char *poutputstr)int i=0,j;int m,z=0;while(ilinputlen)m=0;for(j=i+1;jlinputlen;j+)if(pinputstri=pinputstrj)m+;elsebreak;poutputstrz=m+1+48;poutputstrz+1=pinputstri;z=z+2;i=i+m+1;poutputstrz=0;三、题目描述(50分):通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。补充说明:1、操作数为正整数,不需要考虑计算结果溢出的情况。2、若输入算式格式错误,输出结果为“0”。要求实现函数:void arithmetic(const char *pinputstr, long linputlen, char *poutputstr);【输入】 pinputstr: 输入字符串linputlen: 输入字符串长度【输出】 poutputstr: 输出字符串,空间已经开辟好,与输入字符串等长;【注意】只需要完成该函数功能算法,中间不需要有任何io的输入输出示例输入:“4 + 7” 输出:“11”输入:“4 - 7” 输出:“-3”输入:“9 + 7” 输出:“0” 注:格式错误#include#include#includevoid arithmetic(const char *pinputstr, long linputlen, char *poutputstr);void main()char str256;char sr256;/scanf(%s,str);gets(str);printf(n%sn,str);int len=strlen(str);arithmetic(str,len,sr);printf(%sn,sr);void arithmetic(const char* pinputstr,long linputlen,char* poutputstr) int i,j,num1,num2,result,num_space; char buffer4; bool add,sub; add=sub=false; for(i=0,num_space=0;i=0&pinputstri=9) num1=num1*10+pinputstri-0; else /第一个操作数中有非法字符 poutputstr0=0; poutputstr1=0; return; for(j=i+1;pinputstrj!= ;+j); if(1!=j-i-1) /运算符长度不合法 poutputstr0=0; poutputstr1=0; return; else /操作符的长度为1 if(+!=pinputstri+1&-!=pinputstri+1) /操作符号非法 poutputstr0=0; poutputstr1=0; return; else if(+=pinputstri+1) add=true; if(-=pinputstri+1) sub=true; for(i=j+1;i=0&pinputstri=9) num2=num2*10+pinputstri-0; else /第二个操作数中有非法字符 poutputstr0=0; poutputstr1=0; return; /for if(add) result=num1+num2; else if(sub) result=num1-num2; memset(buffer,0,sizeof(buffer); /itoa(result,buffer,10); /将整数按10进制转换为字符串 sprintf(poutputstr,%d,result); /strcpy(poutputstr,buffer); /esle /else 2013校招机试题1、删除子串,只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数。#include #include #include int delete_sub_str(const char *str,const char *sub_str,char *result) char *temp; int n,count=0; n=strlen(sub_str); temp=(char *)malloc(n+1); memset(temp,0,n+1); while(*str) / memcpy(temp,str,n); strncpy(temp,str,n); if(strcmp(temp,sub_str)=0) count+; memset(temp,0,n+1); str=str+n; else *result=*str; str+; result+; memset(temp,0,n+1); free(temp); return count; void main() char s100=0; int num=delete_sub_str(123abc12de234fg1hi34j123k,123,s); printf(the number of sub_str is %drn,num); printf(the result string is %srn,s); 2、约瑟夫环是一个数学的应用问题:已知 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; p=(linklist *)malloc(sizeof(linklist); p-num=1;head=p; for(i=2;inum=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;inext; printf(%5d,p-num); s=p; q-next=p-next; p=p-next; free(s); printf(%5dn,p-num); void main() linklist *l; int n,m; n=9; m=5; l=creat(n); fun(l,m); 3.比较一个数组的元素 是否为回文数组1234321 123 4 321 这个就是回文.“回文”是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等。在数学中也有这样一类数字有这样的特征,成为回文数(palindrome number)。设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。注意:1.偶数个的数字也有回文数1244212.小数没有回文数#include#includevoid main()int i=0,j;char str100;gets(str);int len=strlen(str);while(ilen/2)if(stri=strlen-i-1)i+;elsebreak;if(i=len/2)printf(the %s is huiwen arrayn,str);elseprintf(the %s is not huiwen arrayn,str);4数组比较(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#includeint array_compare(int len1,int array1,int len2,int array2);void main()int n;int a1=3,4,5;int len1=3;/int a2=1,2,4,5,7;int a2=1,2,3,4,5;int len2=5;n=array_compare(len1,a1,len2,a2);printf(%dn,n);int array_compare(int len1, int array1,int len2,int array2)int i=len1-1,j=len2-1;int m=0;while(i=0&j=0)if(array1i=array2j)i-;j-;elsei-;j-;m+;return m;5、约瑟夫问题 问题描述: 输入一个由随机数组成的数列(数列中每个数均是大于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#include#include#includetypedef struct nodeint num;struct node *next;linklist;void array_iterate(int len,int input_array,int m,int output_array);linklist *creatl(int a,int w);void main()int n=4;int array=3,1,2,4;int array14;int z=7;array_iterate(n,array,z,array1);for(int i=0;inext!=p)for(i=0;inext;output_arrayj+=p-num;t=p-num;s=p;q-next=p-next;p=q-next;output_arrayj=p-num;linklist *creatl(int a,int w)int i;linklist *p,*q,*l;l=(linklist *)malloc(sizeof(linklist);l-num=a0;p=l;for(i=1;inum=ai;p-next=q;p=q;p-next=l;return l;6、手机号码合法性判断(20分) 问题描述: 我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下: 1、长度 13 位; 2、以 86 的国家码打头; 3、手机号码的每一位都是数字。 请实现手机号码合法性判断的函数要求: 1)如果手机号码合法,返回 0; 2)如果手机号码长度不合法,返回1 3)如果手机号码中包含非数字的字符,返回 2; 4)如果手机号码不是以 86打头的,返回 3; 【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。 要求实现函数: int verifymsisdn(char * inmsisdn) 【输入】char* inmsisdn,表示输入的手机号码字符串。 【输出】 无 【返回】 判断的结果,类型为 int。 示例 输入:inmsisdn =“869123456789“ 输出:无 返回:1 输入:inmsisdn =“88139123456789“ 输出:无 返回:3 输入:inmsisdn = “86139123456789“ 输出:无 返回:0#include#includeint verifymsisdn(char * inmsisdn);void main()int n;char str100;gets(str);n=verifymsisdn(str);printf(%dn,n);int verifymsisdn(char * inmsisdn)int len;len=strlen(inmsisdn);if(len!=13)return 1;elsefor(int i=0;ilen;i+)if(inmsisdni9)return 2;if(inmsisdn0!=8)|(inmsisdn1!=6)return 3;elsereturn 0;7、使用c语言实现字符串中子字符串的替换描述:编写一个字符串替换函数,如函数名为 strreplace(char* strsrc, char* strfind, char* strreplace),strsrc为原字符串,strfind 是待替换的字符串,strreplace 为替换字符串。 举个直观的例子吧,如:“abcdefghijklmnopqrstuvwxyz”这个字符串,把其中的“rst”替换为“ggg”这个字符串,结果就变成了:abcdefghijklmnopqggguvwxyz#include#includevoid strreplace(char* strsrc,char* strfind,char* strreplace);void main()char str=abcdefghijklmn;char str1=hij;char str2=ggg;strreplace(str,str1,str2);printf(%sn,str);void strreplace(char* strsrc,char* strfind,char* strreplace)int len1,len2,z,i,j,p;len1=strlen(strsrc);len2=strlen(strfind);for(i=0;ilen1;i+)p=z=i; j=0;while(strsrcp+=strfindj+)if(j=len2)for(p=0;plen2;p+)strsrcp+z=strreplacep;8.算分数的问题,去掉一个最高分一个最低分,求平均分#includeint average(int a,int n);void main()int m;int b5=2,1,4,7,3;m=average(b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论