2012 华为上机试题总结
- 格式:doc
- 大小:24.00 KB
- 文档页数:2
记⼀次华为机试介绍华为机试分为 3 题,两题 100 分,⼀题 200 分,压线 150 分算你过,时间150分钟,⽀持多语⾔环境(⽜客⽹),考试时需全程打开摄像头,电脑屏幕分享,⼿机打开某⼩程序(可⽤计算器)不退出,可⽤本地 IDE, 会有⼀些测试题给你熟悉环境预热的。
备注: 由于脑容量有限,题⽬具体的描述笔者已经记不清了,但是⼀些考点还是记忆犹新,遂记录分享下。
做机考这⼏点很重要, 第⼀点是你要看明⽩它的输⼊输出是什么? 第⼆点是要快,⽐如说你明知道有现成的意⼤利炮可以轰它,咱就不要⾃⼰造个⼟炮了,挺浪费时间的,毕竟机考的本质其实是刷⼈, 第三点就是⼼态⼀定要好,你会做的你要尽量 100%把它做出来,遇到不会的智商题,那也就听天由命了。
消消乐(字符串)描述给定⼀个只包含⼤⼩写字母的字符串(⼤⼩写敏感),若相邻两个元素相等则消除,直到最后字符串消除不了了,输出消消乐后字符串的长度,若遇到⾮⼤⼩写字母以外的字符,则输出0。
⽰例输⼊: mMbccbc输出: 3解释:cc消掉,然后bb消掉,最后剩余mMc,输出长度3题解这⾥我是把⼀些特殊情况单独拎出来处理,然后创建了⼀个字符串res去存最后得到的字符串,然后输出其长度。
const readline = require('readline');const rl = readline.createInterface({input: process.stdin,output: process.stdout,});rl.on('line', function (line) {console.log(solution(line.trim()));});function solution(str) {if (/[^a-zA-Z]/.test(str)) {return 0;}if (str.length === 1) {return 1;}if (str.length === 2) {if (str[0] === str[1]) {return 0;} else {return 2;}}let res = '';let cur = 0;for (let i = 0; i < str.length - 1; i++) {if (str[i] === str[i + 1]) {i++;} else {if (res.length > 0 && res[res.length - 1] === str[i]) {res = res.slice(0, res.length - 1);} else {res += str[i];}}cur = i;}cur = cur + 1;if (str[cur]) {if (res[res.length - 1] === str[cur]) {res = res.slice(0, res.length - 1);} else {res += str[cur];}}return res.length;}矩阵最⼤值(⼆维矩阵)描述给定⼀个n*n的只包含0和1的⼆维矩阵,请你计算出该矩阵的最⼤值。
2012华为校园招聘上机试题+准确答案1.给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成b,z换成a,Z换成A,如aBf转换成bCg,字符串内的其他字符不改变,给定函数,编写函数void Stringchang(const char*inpu,char*output)其中input是输入字符串,output是输出字符串答案:void Stringchang (char *input,char *output){ int len=strlen(input);for(int i=0;i<len;i++){if((input[i]<='Z'&&input[i]>='A')||(input[i]<='z'&&input[i]>='a'))output[i]=input[i]+1;else output[i]=input[i];}}2.求一个整型数字中有没有相同的部分,例如12389756123这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。
方法是先将整型数字转换到数组中,再判断。
函数为int same(int num)其中num是输入的整型数字答案:参考第三题很容易写出代码!3.求两个字符串的乘积,结果存到字符串中,例如字符串一中存的“657891”,字符串二中存的“521”,分别将字符串中的字符转换成整型数字,进行计算后,再转换成字符类型存储起来函数为void mul(char *input1,int n,char *input2, int m,char *output)其中input1和input2是输入,n是input1的长度,n2是input2的长度。
Output是输出答案:void mul(char *input1,int n,char *input2, int m,char *output){ int num1=StrToNum(input1,n);int num2=StrToNum(input2,m);int muti=num1*num2;NumToStr(muti,output);cout<<output<<endl;}int StrToNum(char *input,int len) //字符串转为int型变量{ int delta='0'-0,num=0;for(int i=len-1;i>=0;i--){num+=(input[i]-delta)*pow(10.0,len-i-1);}return num;}void NumToStr(int num,char *output) //int型变量转为字符串{ int len=0;while(1){int flag=num%(int)pow(10.0,len);if(flag==num) break;else len++;}int delta='0'-0,num0=num;for(int i=len-1;i>=0;i--){ output[len-i-1]=num0/(int)pow(10.0,i)+delta;num0=num0%(int)pow(10.0,i);}output[len]='\0';}。
2012届华为校园招聘上机考试题目(9月6日下午1点场)分类:华为准备2011-09-08 15:10 281人阅读评论(0) 收藏举报在网上看到华为在有的地方已经开始机试了,于是决定自己先编着试试。
下面是题目和自己写的代码。
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)view plaincopy to clipboardprint?1. #include<stdio.h>2. #include<string.h>3. #include<iostream.h>4. #include<conio.h>5. #define N 56.7. i nt cal_score(int score[], int judge_type[], int n)8.9. {10. int expert=0;11. int dazhong=0;12. int zongfen=0;13. int i;14. int number=0;15.16. for(i=0;i<N;i++)17. {18. if(judge_type[i]==1)19. {20. expert=expert+score[i];21. number++;22. }23. else dazhong=dazhong+score[i];24. }25. if(number==N)26. {27. zongfen=(int)(expert/N);28. }29. else30.31. {32. expert=(int)(expert/number);33. dazhong=(int)(dazhong/(N-number));34. zongfen=int(0.6*expert+0.4*dazhong);35.36. }37. return zongfen;38.39. }40. int main()41. {42. int score[N];43. int judge_type[N];44. int numberlast=0;45. int i;46. printf("please input the %d score:\n",N);47. for(i=0;i<N;i++)48. scanf("%d",&score[i]);49. printf("please input the level(1:expert,2:dazhong)\n");50. for(i=0;i<N;i++)51. scanf("%d",&judge_type[i]);52. numberlast=cal_score(score,judge_type,N);53. printf("the last score is %d\n",numberlast);54. return 0;55. }运行结果分析:please input the 5 score:90 80 87 89 91please input the level(1:expert,2:dazhong)1 2 1 1 1the last score is 852、给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到output[] 数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到output[] 数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。
1.第一题的题目大概是输入整型数组求数组的最小数和最大数之和,例如输入1,2,3,4则输出为5,当输入只有一个数的时候,则最小数和最大数都是该数,例如只输入1,则输出为2;另外数组的长度不超过50#include<stdio.h>main(){intnum[50]={0};inti,n;printf("请输入整型数组的长度(1~50):");scanf("%d",&n);printf("请输入整型数组的元素:");for(i=0;i<n;i++){scanf("%d",&num[i]);}intmin_num=num[0];intmax_num=num[0];for(intj=0;j<n;j++){if(max_num<num[j])max_num=num[j];elseif(min_num>num[j])min_num=num[j];}intsum=min_num+max_num;printf("数组中最大与最小值之和:%d\n",sum);return0;}2.求两个长长整型的数据的和并输出,例如输入1233333333333333。
3111111111111111111111111.。
,则输出。
#include<stdio.h>#include<string.h>#include<malloc.h>main(){char*num1,*num2; //两个长长整型数据char*sum;// inttemp;int len_num1,len_num2; // 两个长长整型数据的长度intlen_max,len_min;num1=(char*)malloc(sizeof(char));num2=(char*)malloc(sizeof(char));printf("输入两个长长整型数据:");scanf("%s",num1);printf("输入两个长长整型数据:");scanf("%s",num2);len_num1=strlen(num1);len_num2=strlen(num2);len_max=(len_num1>=len_num2)?len_num1:len_num2;len_min=(len_num1<=len_num2)?len_num1:len_num2;int len_max1=len_max;sum=(char*)malloc(sizeof(char)*len_max);memset(sum,0x00,len_max+1);//切忌初始化for(;len_num1>0&&len_num2>0;len_num1--,len_num2--){sum[len_max--]=((num1[len_num1-1]-'0')+(num2[len_num2-1]-'0'));}if(len_num1>0){sum[len_max--]=num1[len_num1- 1 ]-'0';len_num1--;}if(len_num2>0){sum[len_max--]=num1[len_num2- 1]-'0';len_num2--;}for(intj=len_max1;j>=0;j--) //实现进位操作{// temp=sum[j]-'0';if(sum[j]>=10){sum[j-1]+=sum[j]/10;sum[j]%=10;}}char*outsum=(char*)malloc(sizeof(char)*len_max1);j=0;while(sum[j]==0) //跳出头部0元素j++;for(int m=0;m<len_max1;j++,m++)outsum[m]=sum[j]+'0';outsum[m]='\0';printf("输出两长长整型数据之和:%s\n",outsum);return0;}3.通过键盘输入一串小写字母(a~z)组成的字符串。
同学都陆续到华为参加了机试,题目整体难度不大,基本上都是考字符串相关的题目。
这里就分享一套2012年华为南京机试C++或者C的编程题目。
2012年华为南京机试第一题整数化成字符串给定一个整数(有可能是负数),将整数变成字符串。
函数已经声明好类似void change(int number, char s[])的形式。
可以自己写用例测试。
2012年华为南京机试第二题单链表逆序给定一个已经定义好的单链表,将单链表中的数字逆序。
输入为head指针,返回的也是一个head指针。
函数声明为void sor(Node **head)的形式。
2012年华为南京机试第三题字符串最大回文子串给定一个字符串,寻找它的一个最大子串,该子串是回文。
例如给定用例字符串”gabcdcbaef”,那么最大回文字串是”abcdcba”。
函数声明为void huiwen(char input[], intlen, char output[])。
一天几个考场的题目有相同的也有不同的,基本上难度都不大。
要求做前两题就可以了,有能力的可以做第三题并且计入总分。
有同学做完当场就看到是100分,也有0分的,至于怎么计分的不太清楚。
希望七叶草提供的2012年华为南京机试编程题对你有帮助!武汉题目:有一个数组a[N]如a[10]={0,1,2,3,4,5,6,7,8,9}每隔两个数删除一个数,如0,1,2(删除),3,4,5(删除),6,7,8(删除),9,到数组尾部回到数组头部继续删除,要求编写一个函数实现实现上述操作,返回最后一个数的数组下标。
函数接口:intgetLast(intiLen)参数:数组初始元素个数iLen01 #include <stdio.h>02 #include <stdlib.h>0304 typedef struct node *List;05 typedef struct node *PNode;0607 typedef struct node08 {09 int data;10 struct node *next;11 }Node;1213 int getLast(int iLen)14 {15 int i;16 List L;17 PNodetempNode,current;18 L = (List)malloc(sizeof(Node));19 L->next = NULL;20 current = L;21 for (i=0; i<iLen; i++)22 {23 tempNode = (PNode)malloc(sizeof(Node));24 tempNode->data = i;25 current->next = tempNode;26 current = tempNode;27 }28 current->next = L->next;29 current = L;30 while (iLen> 1)31 {32 current = current->next->next;33 tempNode = current->next;34 current->next = tempNode->next;35 printf("%d\n",tempNode->data);36 free(tempNode);37 iLen--;38 }39 return current->data;40 }4142 int main()43 {44 printf("last of 20 is %d",getLast(20));45 return 0;46 }编程题(共2题,第一题40分,第二题60分,共100分。
1.第一题的题目大概是输入整型数组求数组的最小数和最大数之和,例如输入1,2,3,4则输出为5,当输入只有一个数的时候,则最小数和最大数都是该数,例如只输入1,则输出为2;另外数组的长度不超过50include<>main{intnum50={0};inti,n;printf"请输入整型数组的长度1~50:";scanf"%d",&n;printf"请输入整型数组的元素:";fori=0;i<n;i++{scanf"%d",&numi;}intmin_num=num0;intmax_num=num0;forintj=0;j<n;j++{ifmax_num<numjmax_num=numj;elseifmin_num>numjmin_num=numj;}intsum=min_num+max_num;printf"数组中最大与最小值之和:%d\n",sum;return0;}include<>include<>include<>main{charnum1,num2; 过键盘输入一串小写字母a~z组成的字符串;请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉;比如字符串“abacacde”过滤结果为“abcde”;要求实现函数:void stringFilterconst char pInputStr,long lInputLen, char pOutputStr;输入pInputStr:输入字符串lInputLen:输入字符串长度输出pOutputStr:输出字符串,空间已经开辟好,与输入字符串等长;include <>include<>include<>void stringFilterconst char p_str, longlen, char p_outstr {intarray256={0};const char tmp = p_str;forint j=0;j<len;j++{ifarraytmpj==0p_outstr++=tmpj;arraytmpj++;}p_outstr= '\0';}void main{char str = "cccddecc";intlen = strlenstr;char outstr = char malloclensizeofchar; stringFilterstr,len,outstr;printf"%s\n",outstr;freeoutstr;outstr= NULL;}4.通过键盘输入一串小写字母a~z组成的字符串;请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串;压缩规则:1. 仅压缩连续重复出现的字符;比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".2. 压缩字段的格式为"字符重复的次数+字符";例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"要求实现函数:void stringZipconst charpInputStr, long lInputLen, char pOutputStr;输入pInputStr:输入字符串lInputLen:输入字符串长度输出pOutputStr:输出字符串,空间已经开辟好,与输入字符串等长;include <>include<>include<>void stringZipconst char p_str, long len,char p_outstr{intcount=1;forinti=0;i<len;i++{ifp_stri==p_stri+1{count++;}else{ifcount>1{p_outstr++= count +'0';p_outstr++=p_stri;}else{p_outstr++=p_stri;}count = 1;过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串;输入字符串的格式为:“操作数1 运算符操作数2”,“操作数”与“运算符”之间以一个空格隔开;补充说明:1. 操作数为正整数,不需要考虑计算结果溢出的情况;2. 若输入算式格式错误,输出结果为“0”;要求实现函数:void arithmeticconst charpInputStr, long lInputLen, char pOutputStr;输入pInputStr:输入字符串lInputLen:输入字符串长度输出pOutputStr:输出字符串,空间已经开辟好,与输入字符串等长;include <>include<>include<>void arithmeticconst char input, longlen, char output{chars110;chars210;chars310;intcnt = 0;intlen_input=strleninput;forinti=0;i<len_input;++i{ifinputi==''cnt++;}ifcnt=2{output++= '0';output= '\0';return;}sscanfinput,"%s %s %s",s1,s2,s3; if strlens2=1||s20='+'&&s20='-' {output++= '0';output= '\0';return;}int len_s1=strlens1;fori=0;i<len_s1;i++{ifs1i<'0'||s1i>'9'{output++= '0';output= '\0';return;}}intlen_s3=strlens3;fori=0;i<len_s3;i++{ifs3i<'0'||s3i>'9' {output++= '0'; output= '\0'; return;}}int x = atois1;int y = atois3;ifs20=='+'{intresult = x+y; itoaresult,output,10; }elseifs20=='-'{intresult = x-y; itoaresult,output,10; }else{output++= '0';output= '\0';return;}}void main{charstr = {"10 - 23"};charoutstr10;intlen = strlenstr;arithmeticstr,len,outstr;printf"%s\n",str;printf"%s\n",outstr;}6.一组人n个,围成一圈,从某人开始数到第三个的人出列,再接着从下一个人开始数,最终输出最终出列的人约瑟夫环是一个数学的应用问题:已知n个人以编号1,2,3...n分别表示围坐在一张圆桌周围;从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列; include <>include<>include<>include<>typedef struct Node{intdata;structNode next;}LinkList;LinkList createint n{LinkListp,q,head;inti=1;p=LinkListmallocsizeofLinkList;p->data=i;head=p;fori=1;i<=n;i++{q=LinkListmallocsizeofLinkList;q->data=i+1;p->next=q;p=q;}p->next=head; 输入一串字符,只包含“0-10”和“,”找出其中最小的数字和最大的数字可能不止一个,输出最后剩余数字个数;如输入“3,3,4,5,6,7,7”include<>include<>include<>void main{charstr100;printf"输入一组字符串:\n"; scanf"%s",&str;intlen=strlenstr;intarray100;intcount=0;forinti=0;i<len;i++{ifstri>='0'&&stri<='9' arraycount++=stri-'0';}arraycount='\0';intresult=count;intmin=array0;intmax=array0;forintj=0;j<count;j++{ifmax<arrayjmax=arrayj;elseifmin>arrayjmin=arrayj;}forintk=0;k<count;k++{ifarrayk==minresult--;ifarrayk==maxresult--;}printf"%d\n",result;}8.输入一组身高在170到190之间5个身高,比较身高差,选出身高差最小的两个身高;若身高差相同,选平均身高高的那两个身高;从小到大输出;如输入170 181173 186 190 输出170 173include<>include<>define N 5int main{intHeightN;intdmin;intH1,H2;inti,j,temp;printf"请输入一组身高在170到190之间的数据共5个:\n"; forintk=0;k<N;k++scanf"%d",&Heightk;printf"\n";fori=0;i<N;i++forj=1;j<N-i&&Heightj-1>Heightj;j++{temp=Heightj-1;Heightj-1=Heightj;Heightj=temp;}H1=Height0;H2=Height1;dmin=H2-H1;forintm=2;m<N;m++{ifHeightm-Heightm-1<=dmin{H1=Heightm-1;H2=Heightm;dmin=Heightm-Heightm-1;}}printf"身高差最小的两个身高为:\n";printf"%d,%d\n",H1,H2;return0;}9.删除子串,只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数; include <>include <>include <>include <>int delete_sub_strconst char str,constchar sub_str,char result{assertstr= NULL && sub_str = NULL;constchar p,q;chart,temp;p= str;q= sub_str;t= result;intn,count = 0;n= strlenq;temp= char mallocn+1; memsettemp,0x00,n+1; whilep{memcpytemp,p,n; ifstrcmptemp,q== 0 {count++; memsettemp,0x00,n+1; p= p + n;}else{t= p;p++;t++; memsettemp,0x00,n+1; }}freetemp;returncount;}void main{chars100 = {‘\0’};intnum = delete_sub_str“123abc12de234fg1hi34j123k”,”123”,s;printf“Thenumber of sub_str is %d\r\n”,num;printf“Theresult string is %s\r\n”,s;}10. 要求编程实现上述高精度的十进制加法;要求实现函数:void add const char num1,const char num2, char result输入num1:字符串形式操作数1,如果操作数为负,则num10为符号位'-'num2:字符串形式操作数2,如果操作数为负,则num20为符号位'-'输出result:保存加法计算结果字符串,如果结果为负,则result0为符号位; include<>include<>include<>void movechar str, int length描述:10个学生考完期末考试评卷完成后,A老师需要划出及格线,要求如下:1 及格线是10的倍数;2 保证至少有60%的学生及格;3 如果所有的学生都高于60分,则及格线为60分输入:输入10个整数,取值0~100输出:输出及格线,10的倍数include<>void bubblesortint arr{inti,j,temp;fori=0;i<10;i++forj=0;j<9-i&&arrj>arrj+1;j++ {temp=arrj;arrj=arrj+1;arrj+1=temp;}}int GetPassLineint a{bubblesorta;ifa0>=60return60;elsereturninta4/1010;}main{inta10={0};intresult;printf"请随机输入10个成绩0-100:\n";scanf"%d%d%d%d%d%d%d%d%d%d",&a0,&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8,&a9; printf"\n";result=GetPassLinea;printf"及格线为:%d\n",result;return1;}12.描述:一条长廊里依次装有n1 ≤ n ≤ 65535盏电灯,从头到尾编号1、2、3、…n-1、n;每盏电灯由一个拉线开关控制;开始,电灯全部关着;有n个学生从长廊穿过;第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n 的倍数的电灯的开关拉一下;n个学生按此规定走完后,长廊里电灯有几盏亮着;注:电灯数和学生数一致;输入:电灯的数量输出:亮着的电灯数量样例输入:3样例输出:1include<>define Max_Bubl_Num 65535int GetLightLampNumint n{intBublNumMax_Bubl_Num={0}; 描述:已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的;经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示;编写程序,任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量含输入的起点和终点,换乘站点只计算一次;地铁线A环线经过车站:A1 A2 A3 A4 A5 A6A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18地铁线B直线经过车站:B1 B2 B3 B4 B5 T1B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B15输入:输入两个不同的站名输出:输出最少经过的站数,含输入的起点和终点,换乘站点只计算一次输入样例:A1 A3输出样例:3include<>include<string>include<queue>include<vector>using namespace std;define MAX 35define SUBWAY_A 20define SUBWAY_B 15typedef struct node{int adjvex;struct node next;}edgenode;typedef struct{char name10;bool flag;edgenode link;}vexnode;constcharsubway_name1SUBWAY_A10={"A1","A2","A3","A4","A5","A6","A7","A8","A9","T1 ","A10","A11","A12","A13","T2","A14","A15","A16","A17","A18"};constcharsubway_name2SUBWAY_B10={"B1","B2","B3","B4","B5","B6","B7","B8","B9","B1 0","B11","B12","B13","B14","B15"};void creatvexnode ga{int i;edgenode p;fori=0;i<MAX;i++{gai.link=NULL;gai.flag=true;ifi<SUBWAY_,subway_name1i;,subway_name2i-20;}ink=p;p=edgenodemallocsizeofedgenode; p->adjvex=i+1;p->next=NULL;gai.link->next=p;ifi==9{p=edgenodemallocsizeofedgenode; p->adjvex=SUBWAY_A+4;p->next=NULL;gai.link->next->next=p;p=edgenodemallocsizeofedgenode; p->adjvex=SUBWAY_A+5;p->next=NULL;gai.link->next->next->next=p;}else ifi==14{p=edgenodemallocsizeofedgenode; p->adjvex=SUBWAY_A+9;p->next=NULL;gai.link->next->next=p;p=edgenodemallocsizeofedgenode;p->adjvex=SUBWAY_A+10;p->next=NULL;gai.link->next->next->next=p;}}p=edgenodemallocsizeofedgenode; p->adjvex=SUBWAY_A-1;p->next=NULL;ga0.link=p;p=edgenodemallocsizeofedgenode; p->adjvex=1;p->next=NULL;ga0.link->next=p;p=edgenodemallocsizeofedgenode; p->adjvex=SUBWAY_A-2;p->next=NULL;gaSUBWAY_A-1.link=p;p=edgenodemallocsizeofedgenode; p->adjvex=0;p->next=NULL;gaSUBWAY_A-1.link->next=p;ink=p;p=edgenodemallocsizeofedgenode; p->adjvex=SUBWAY_A+i+1;p->next=NULL;gai+SUBWAY_A.link->next=p;}p=edgenodemallocsizeofedgenode; p->adjvex=SUBWAY_A+3;p->next=NULL;gaSUBWAY_A+4.link=p;p=edgenodemallocsizeofedgenode; p->adjvex=9;p->next=NULL;gaSUBWAY_A+4.link->next=p;p=edgenodemallocsizeofedgenode; p->adjvex=9;p->next=NULL;gaSUBWAY_A+5.link=p;p=edgenodemallocsizeofedgenode; p->adjvex=SUBWAY_A+6;p->next=NULL;gaSUBWAY_A+5.link->next=p;p=edgenodemallocsizeofedgenode;p->adjvex=SUBWAY_A+8;p->next=NULL;gaSUBWAY_A+9.link=p;p=edgenodemallocsizeofedgenode; p->adjvex=14;p->next=NULL;gaSUBWAY_A+9.link->next=p;p=edgenodemallocsizeofedgenode; p->adjvex=14;p->next=NULL;gaSUBWAY_A+10.link=p;p=edgenodemallocsizeofedgenode; p->adjvex=SUBWAY_A+11;p->next=NULL;gaSUBWAY_A+10.link->next=p;p=edgenodemallocsizeofedgenode; p->adjvex=SUBWAY_A+1;p->next=NULL;gaSUBWAY_A.link=p;p=edgenodemallocsizeofedgenode; p->adjvex=SUBWAY_A+SUBWAY_B-2; p->next=NULL;gaSUBWAY_A+SUBWAY_B-1.link=p; ame;edgenode s;s=gai.link;whiles=NULL{printf"->%s",gas->;s=s->next;}printf"\n";}}int main{vexnode gaMAX;creatga;int i;char str210;whilescanf"%s%s",str0,str1=EOF{ int temp=0;fori=0;i<MAX;i++{gai.flag=true;ifstrcmpstr0,temp=i;}queue<vexnode>q; gatemp;gatemp.flag=false;int count=0;int start=0;int end=1;bool find_flag=false;while{iffind_flag break;count++;printf"\n";printf"第%d层搜索:",count; int temp_end=end; whilestart<temp_end{ printf"%s",.name; ,str1{find_flag=true;break;}edgenode s;s=.link;whiles=NULL{ifgas->adjvex.flag{gas->adjvex;gas->adjvex.flag=false;end++;ame;}s=s->next;};start++;}printf"\n";}printf"%d\n",count;}return 0;}14. 字串转换问题描述:将输入的字符串字符串仅包含小写字母‘a’到‘z’,按照如下规则,循环转换后输出:a->b,b->c,…,y->z,z->a;若输入的字符串连续出现两个字母相同时,后一个字母需要连续转换2次;例如:aa 转换为bc,zz 转换为ab;当连续相同字母超过两个时,第三个出现的字母按第一次出现算;要求实现函数:voidconvertchar input,char output输入char input , 输入的字符串输出char output ,输出的字符串返回无include<>include<>include<>void convertchar input,char output{ifinput==NULLreturn;chartemp='\0';intlen_input=strleninput;inti;intflag=0;fori=0;i<len_input;i++{ifinputi=temp{outputi=inputi-'a'+1%26+'a';temp=inputi;flag=1;}else{ifflag==1{outputi=inputi-'a'+2%26+'a'; temp=inputi;flag=0;}else{outputi=inputi-'a'+1%26+'a'; temp=inputi;flag=1;}}}outputi='\0';}void main{charinput="xyz"; charoutput256;在给定字符串中找出单词“单词”由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,如空格、问号、数字等等;另外单个字母不算单词;找到单词后,按照长度进行降序排序,排序时如果长度相同,则按出现的顺序进行排列,然后输出到一个新的字符串中;如果某个单词重复出现多次,则只输出一次;如果整个输入的字符串中没有找到单词,请输出空串;输出的单词之间使用一个“空格”隔开,最后一个单词后不加空格;要求实现函数:void my_wordcharinput, char output输入char input, 输入的字符串输出char output,输出的字符串返回无include <>include <>include <>void my_wordchar input,charoutput{char p;char temp;char word10;int len_input=strleninput;int i,j;char except = ",";char blank = " ";i=0;for i=0;i<len_input;i++{if inputi<'A' || inputi>'Z'&&inputi<'a' ||inputi>'z' {inputi=',';}}j=0;/保存取出的单词/p= strtokinput,except;whileNULL=p{wordj++=p;p= strtokNULL,except;}printf"%s",wordi;/对单词按照长度降序排序,冒泡法/ for i=0;i<5;i++{for j=1;j<5-i;j++{ifstrlenwordj-1<strlenwordj{temp=wordj;wordj=wordj-1;wordj-1=temp;}}}/删除相同单词/{forj=i+1;j<5;j++{ifstrcmpwordi,wordj==0wordj="\0";}}/将单词连接起来输出/for j=0;j<5;j++{if 0==j{strncpy output,wordj,strlenwordj+1; }else{strcatoutput,blank;strcatoutput,wordj;}}return ;}int main{char input ="some local buses, some1234123drivers"; printf"筛选之前的字符串:%s\n",input;char output30;my_wordinput,output;printf"筛选之后的字符串:%s",output;printf"\n";return 0;}16. 数组中数字都两两相同,只有一个不同,找出该数字:int findUniqueint a, int len{int i = 1;int temp =a0;for; i <len; i++{temp= temp ^ ai;}printf"%d", temp;}17.题目二:数组中数字两两相同,有两个不同,找出这两个:include <>int a = {1,1,2,4,3,3,2,5};int findXorSumint a, int len{int i = 0;int temp =0;for; i <len; i++{temp= temp ^ ai;}return temp;}int findFirstBit1int n{int count =1;while n &1{n =n>>1;count++;}returncount;}int isBit1int a, int count{a= a >> count-1;returna & 1;}void findTwoUniqueint a, int len {int i = 0;int m = 0, n= 0;int temp =findXorSuma, len;int count =findFirstBit1temp;for; i <len; i++{ifisBit1ai,count{m= m ^ ai;}else{n= n ^ ai;}}printf"%d,%d", m, n;}int main{findTwoUniquea,8;}18.链表翻转;给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现思想:采用遍历链表,分成length/k组,对每组进行逆转,逆转的同时要将逆转后的尾和头连接起来链表相邻元素翻转,如a->b->c->d->e->f-g,翻转后变为:b->a->d->c->f->e->g include <>include <>include <>typedef struct node{charval;structnode pNext;}Node;Node CreateListint n;void TraverslistNode pHead;Node TransNeighborNode pHead;int main{NodepHead = CreateList7;printf"beforetransform\n";TraverslistpHead;TransNeighborpHead;printf"\naftertransform\n";TraverslistpHead;getchar;return1;输入一串字符串,其中有普通的字符与括号组成包括‘’、‘’、‘’,'',要求验证括号是否匹配,如果匹配则输出0、否则输出1.include<>include<>入一行数字:1234235645875186523在输入第二行:23将第一行中含有第二行中“23”的数输出并排序结果即:123423186523include<>define M 20int main{int aM;int i,j,s,temp;int sortM,t=0;char c=' ';i=0;whilec='\n'{scanf"%d%c",&temp,&c;ai++=temp;scanf"%d",&s; forj=0;j<i;j++ {temp=aj; iftemp%100==s {sortt++=aj;}elsetemp/=10;}fori=0;i<t-1;i++ forj=0;j<t-i-1;j++ {ifsortj>sortj+1 {temp=sortj+1; sortj+1=sortj; sortj=temp;}}fori=0;i<t;i++printf"%d",sorti;printf"\n";return 0;}22输入m个字符串和一个整数n,把字符串M化成以N为单位的段,不足的位数用0补齐;如n=8m=9,include<>include<>int main{char c200={'\0'};scanf"%s",&c;int n,i,j;int len=strlenc;scanf"%d",&n;fori=1;i<=len;i++{j=i%n;printf"%c",ci-1;ifj==0printf"\n";}ifj=0fori=j+1;i<=n;i++printf"0";return 0;}23将电话号码onetwo;;;ninezero翻译成12;;90中间会有double例如输入:OneTwoThree输出:123输入:OneTwoDoubleTwo输出:1222输入:1Two2 输出:ERROR输入:DoubleDoubleTwo 输出:ERROR有空格,非法字符,两个Double相连,Double位于最后一个单词都错误include<>include<>include<>int main{chara1111={"zero","one","two","three","four","five","six","seven","eight","nine","dou ble"};char temp11, c=' ';int i,j,f,d=0;whilec='\n'{scanf"%s%c",&temp,&c;f=0;forj=0;j<11;j++{ifstrcmptemp,aj&&j<10 {printf"%d",j;f=1;ifd==1{printf"%d",j;d=0;}}elseifstrcmptemp,aj&&j==10 {d=1;f=1;}}iff==0break;}ifd==1||f==0printf"error\n";printf"\n";return 0;}24.将整数倒序输出,剔除重复数据include<>include<>include<>include<>int main{charinput=charmallocsizeofchar; scanf"%s",input;inta10={0},i,flag=0,flag1=0;int len=strleninput;ifinput0=='-'{flag=1;fori=0;i<len;i++inputi=inputi+1;}intlen1=strleninput;int n50,temp;int count=0;fori=0;i<len1;i++{temp=inputi-'0'; ifatemp==0{ncount++=temp; atemp=1;}}ncount='\0';ifflag==1 printf"-";forintii=count-1;ii>=0;ii-- {ifnii=0||flag1=0{printf"%d",nii;flag1=1;}}printf"\n";return 0;}25.编程的时候,if条件里面的“”、“”括号经常出现不匹配的情况导致编译不过,请编写程序检测输入一行if语句中的圆括号是否匹配正确;同时输出语句中出现的左括号和右括号数量,如ifa==1&&b==1是正确的,而ifa==1&&b==1是错误的;注意if 语句的最外面至少有一对括号;提示:用堆栈来做;输入:ifa==1&&b==1输出:RIGTH 3 3输入:ifa==1&&b==1输出:WRONG 3 4include<>include<>int main{char s800={'\0'};scanf"%s",&s;.alen-1voidarray_iterateint len, int input_array, int m, int output_array {int startPos=0;int outPos;int nIter=len-1;int num=len;for; nIter>=0; nIter--{outPos=m+startPos-1%num;m=input_arrayoutPos;startPos=outPos;printf"outPos is %d, new m is%d\n", outPos, m;output_arraylen-nIter-1=input_arrayoutPos;forint i=outPos; i<num-1; i++input_arrayi=input_arrayi+1;num--;print_arraynum, input_array;}}voidmain{int input_array={3,1,2,4};int output_array4={0};array_iterate4, input_array, 7,output_array; print_array4, output_array;}27.统计数字出现的次数,最大次数的统计出来举例:输出:3,6include<>include<>include<>int main{inta10={0};intlen=strlennum;inti,j,temp,count=0,maxnum=0;printf"%d\n",len;fori=0;i<len;i++{temp=numi-'0';atemp++;}inttemp1=a0;forj=0;j<10;j++{ifaj=0{count++;temp1=temp1>ajtemp1:aj; printf"%d%d\n",aj,j;}}printf"数字出现次数为:%d\n",count; printf"最大次数为:%d\n",temp1; return0;}28. .字符串首字母转换成大写举例:输入:this is a book返回:This Is A Bookinclude<>include<>include<>int main{charinput="this is a book"; charoutput256={'\0'};int i,len;len=strleninput;printf"变换前的字符串为:%s\n",input; fori=0;i<len;i++{ifinput0=''input0-=32;ifinputi==''inputi+1-=32;outputi=inputi;}printf"变换后的字符串为:%s\n",output; }29.子串分离题目描述:。
1. 从两个数组的最后一个元素比较两个数组中不同元素的个数,如有array1[5]={77,21,1,3,5}, array2[3]={1,3,5},从array1[4]与array2[2]比较开始,到array1[2]与array[0]比较结束。
这样得出它们不同的元素个数为0,若array1[6]={77,21,1,3,5,7},那么他们不同的元素为3。
函数原型为int compare_array( int len1, int array1[], int len2, int array2[] );其中,len1与len2分别为数组array1[]和array2[]的长度,函数返回值为两个数组不同元素的个数。
以下是上题的函数完整实现://diff_num.cpp#include<stdio.h>int compare_array(int len1,int array1[],int len2,int array2[]){int i,t,small,num=0;//把两数组倒置for(i=0;i<len1/2;i++){t=array1[i];array1[i]=array1[len1-i-1];array1[len1-i-1]=t;}for(i=0;i<len2/2;i++){t=array2[i];array2[i]=array2[len2-i-1];array2[len2-i-1]=t;}//输出倒置后的两数组/* for(i=0;i<len1;i++)printf("%d ",array1[i]);printf("\n");for(i=0;i<len2;i++)printf("%d ",array2[i]);*/ printf("\n");if(len1>len2)small=len2;elsesmall=len1;num=small;for(i=0;i<small;i++){if(array1[i]==array2[i])num--;}printf("num=%d\n",num);return num;}void main(){int array1[5]={77,21,1,3,5},array2[3]={1,3,5};int len1=5,len2=3;compare_array(len1,array1,len2,array2);}如同往年,华为今年刚一开学就来学校宣讲了,9月6日和7日安排了软件研发类的上机笔试(其他职位没有笔试,直接通过网上注册的简历筛选并安排面试)。
华为笔试来源:马彬龙好孩子的日志1、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。
要用全局变量,需要使用"::"局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
2、如何引用一个已经定义过的全局变量?答:extern可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?答:可以,在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。
4、语句for( ;1 ;)有什么问题?它是什么意思?答:无限循环,和while(1)相同。
5、do……while和while……do有什么区别?答:前一个循环一遍再判断,后一个判断以后再循环。
6、请写出下列代码的输出内容#i nclude<stdio.h>main(){int a,b,c,d;a=10;b=a++;c=++a;d=10*a++;printf("b,c,d:%d,%d,%d",b,c,d);return 0;}答:10,12,120一、判断题(对的写T,错的写F并说明原因,每小题4分,共20分)1、有数组定义int a[2][2]={{1},{2,3}};则a[0][1]的值为0。
()2、int (*ptr) (),则ptr是一维数组的名字。
()3、指针在任何情况下都可进行>, <, >=, <=, = =运算。
地区1:
数组比较
约瑟夫环
字符串计算
地区2:
单链表逆序
地区3:
1. 编写函数,string deletestring(string str,string sub_str)从str中查找匹配的字符串sub_str,采用最左匹配,且输出形式为str+"_"+匹配的次数
2. 高精度数相加,string addBigInt(string num1,string num2) 需要考虑正负数相加
地区4:
第一题【20分】:鉴定回文数组。
第二题【30分】:求两个整型数组的异集,即A+B-(A与B的交集)。
第三题【50分】:判定德州扑克的牌型。
给5张牌,返回它的牌型,4个的,3个+对子,顺子,3个+2个单张,2对,1对,其他。
地区5:
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_task[])。