logo资料库

华为历年招聘机试题完全总结(代码全部调试通过).doc

第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
资料共17页,剩余部分请下载后查看
#include
#include
#include
#include
#define N 5
1. char*inpu,char*output) 给定一个字符串,把字符串内的字母转换成该 字母的下一个字母,a 换成 b,z 换成 a,Z 换成 A, 如 aBf 转换成 bCg,字符串内的其他字符不改变, 给定函数,编写函数 void Stringchang(const 其中 input 是输入字符串,output 是输出字符串 #include #include void Stringchang(const { const char *p=input; /*if(input==NULL) { char*input,char*output) printf("ERROR"); return; //用这种表示方式可否? //用 return 好不好? if((*p>='a')&&(*p<='y')||(*p>='A')&&(*p<='Y') } */ assert(input!=NULL); while(*p!='\0') { *output=*p+1; else if(*p=='z'||*p=='Z') *output=*p+1-26; *output=*p; else output++; p++; ) } } *output=0; } void main() { char a[11]={"abc"}; char b[11]; Stringchang(a,b); printf("%s",b); //如何模拟空指针的情况 3. 2. 求一个整型数字中有没有相同的部分,例如 12389756123 这个整型数字中相同的部分是 123, 相同的部分至少应该是 2 位数,如果有相同部分返 回 1,如果没有则返回 0。函数为 int same(int num) 其中 num 是输入的整型数字 #include using namespace std; int same(int num) //整数值的范围:long int 为-2(共 10 位)到正 2 开头共 10 位; unsigned //long int 为从0 到4 的共 10 位数 { char a[11]; int i=0,m=0,j=0; while(num) { a[i]=num%10+'0'; num=num/10; i++; j++; } i=0; int k=j; while(i>a; b=same(a); cout< #include #include using namespace std; void mul(char *input1,int n,char *input2,int m,char *output) { long int num1=0,num2=0,num3=0; //char *p1=input1;char *p2=input2; int i=0,j=0,temp; int sign1=0,sign2=0; assert(input1!=NULL&&input2!=NULL); //以下程序是将 input1 字符串转换为数字,考虑到 了字符串中第一个字符为‘+’或者‘-’号的情况, //同时考虑到了非法输入时的处理情况。
assert(*input1<='9'&&*input1>='0'); num1=num1*10+(*input1-'0'); input1++; //以下程序是将 input2 字符串转换为数字,考虑到 了字符串中第一个字符为‘+’或者‘-’号的情况, //同时考虑到了非法输入时的处理情况。 if(*input1=='-') { input1++; sign1=1; } if(*input1=='+') input1++; while(*input1!='\0') { } if(sign1==1) num1=-num1; if(*input2=='-') { input2++; sign2=1; } if(*input2=='+') input2++; while(*input2!='\0') { assert(*input2<='9'&&*input2>='0'); num2=num2*10+(*input2-'0'); input2++; } if(sign2==1) num2=-num2; //将两个数相乘 num3=num1*num2; //考虑到结果为负数的情况,将整数转换为字符串, 并且将字符串倒序 if(num3<0) { output[i]='-'; i++; j++; num3=-num3; } while(num3) { output[i]=num3%10+'0'; i++; num3=num3/10; } output[i]=0; //将字符串倒序 i--; while(j>a; cin>>b; anum=strlen(a); bnum=strlen(b); mul(a,anum,b,bnum,c); cout< #include void mul(char *input1,int n,char *input2,int m,char *output) { int sum1=0,sum2=0,sum=0; int i=0; int sign1,sign2; char *p=input1,*q=input2,*s=output,*r=output; assert(input1!=NULL&&input2!=NULL); if(*p=='+') { assert(*p<='9'&&*p>='0'); sum1=sum1*10+(*p-'0'); p++; p++; sign1=1; } else if(*p=='-') { p++; sign1=0; } while(*p) { sum1=-sum1; } if(sign1==0) { } //input2de chuli if(*q=='+') {q++;sign2=1;} else if(*q=='-') {q++;sign2=0;} while(*q) { assert(*q<='9'&&*q>='0'); sum2=sum2*10+(*q-'0'); q++; }
if(sign2==0) {sum2=-sum2;} //两数相乘 sum=sum1*sum2; printf("%d",sum); if(sum<0) { // sum=-sum; *s='-'; s++; r++; //因为返回的指针开始地址是output, 所以这里 output 不能变,只能是另外用一个指针代 替他 } while(sum) { *s=sum%10+'0'; sum=sum/10; s++; //忘记 s- - 了 } *s=0; s--; //printf("%s\n",output); while(r #include #include #define N 100 void GetDigits(int *a,char *s); void multiply(int *a,int *b,int *c); main() { char s1[N],s2[N]; int i,j,a[N],b[N],c[N*2]; //把输入的字符串,按位存放到数组 GetDigits(a,s1); GetDigits(b,s2); multiply(a,b,c); //找到最高位 j=N*2-1; while(c[j]==0) j--; //打印计算结果 printf("\n %s * %s=",s1,s2); for(i=j;i>=0;i--) printf("%d",c[i]); } /*把字符串形式的数字按位存放到数组*/ void GetDigits(int *a, char *s) { int i; char digit; int len=strlen(s); for(i=0;i
5、删除子串(不会做),只要是原串中有相同的 子串就删掉,不管有多少个,返回子串个数。 #include #include #include #include int *sub_str,char *result) { delete_sub_str(const *str,const char char const char *p,*q; //注意最刚开始就要加 const p=str; q=sub_str; int count=0; int num=strlen(sub_str); assert(str!=NULL&&sub_str!=NULL); while(*p!='\0') { //没有想法 if(*p==*q) { for(int i=1;i #include char s[100] = {'\0'}; int = delete_sub_str("123abc12de234fg1hi34j123k","123",s) ; num printf("The number of sub_str is %d\r\n",num); printf("The result string is %s\r\n",s); char *str,const char delete_sub_str(const int *sub_str,char *result) { const char *p,*q; char *r; p=str; q=sub_str; r=result; int num=0,i=0,k=0; while(*(p+i)) { if(*(p+i)==*(q)) { for(int j=0;*(q+j)!='\0';j++) { if(*(p+i+j)!=*(q+j)) break; } if(*(q+j)=='\0') { num++; i+=j; } *(r+k)=*(p+i); k++; i++; } else { } } *(r+k)=0; return num; } void main() { char s[100] = {'\0'}; int num = delete_sub_str("a123abc123de","123",s); printf("The number of sub_str is %d\r\n",num); printf("The result string is %s\r\n",s); } 6、比较一个数组的元素 是否为回文数组 #include #include #include int huiwen(char str[]) { char *p=str; int i=0; int j=strlen(str); assert(str!=NULL); j--; while(i
{77,21,1,3,5}, {1,3,5}, {77,21,1,3,5,7}, 3, 3, int len1 = int array2[] = int len2 = 5 函数返回:0 2) 输入:int array1[] = int len1 = int array2[] = int len2 = 6 函数返回:3 #include #include #include #include int array_compare(int len1, int array1[], int len2, int array2[]) { int count=0; assert(array1!=NULL&&array2!=NULL); // 如 何对传输的数组判空? while(len1!=0&&len2!=0) // 做 错 了 , 写 成 了 (len1!=-1&&len2!=-1),注意这里的 len1 与 len2 分别 是数组的长度,不是下标编号!!! { if(array1[len1-1]!=array2[len2-1]) /*提示输入 /*scan() count++; len1--; len2--; } return count; } void main() { } /*或者是用下面的方法 原理是一样的 int i=0,j=0; assert(str!=NULL); while(str[j]) { j--; } return 1; j++; } j--; while(i
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) #include #include #include #include #define N 5 //总数:total 平均数:average 记住要强制类型转 换为(int),记住不要忘记判断当大众评委//为 0 时 的情况,自己还额外加了当专家评委为零的情况。 #include #include #include #include #define N 5 int cal_score(int score[], int judge_type[], int n) 该如何判断数组为空时的情况 { // int total1=0,total2=0,average1=0,average2=0,num1=0,nu m2=0; 字符串。 【输出】 无 【返回】 判断的结果,类型为 int。  示例 输入: inMsisdn = “869123456789“ 输出: 无 返回: 1 输入: inMsisdn = “88139123456789“ 输出: 无 返回: 3 输入: inMsisdn = “86139123456789“ 输出: 无 返回: 0 #include #include #include #include int verifyMsisdn(char* inMsisdn) //记住:此 处比较的是和字符‘0’比较,而不是和数字 0 比 较 { char *p = inMsisdn; assert(p!=NULL); int num=strlen(p); if(num!=13) //在面试的 时候最好用宏定义表达:#define LENGTH 13 return 1; for(int i=0;i<13;i++) if(*(p+i)<'0'||*(p+i)>'9') return 2; if((*p!='8')||(*(p+1)!='6')) return 3; return 0; } void main() { char number[15]="8613312345678"; int sign=verifyMsisdn(number); printf("%d\n",sign); char number1[15]="86133123456789"; //老 是忘记:不能对数组直接赋值 sign=verifyMsisdn(number1); printf("%d\n",sign); char number2[15]="861331234567@"; sign=verifyMsisdn(number2); printf("%d\n",sign); char number3[15]="8113312345679"; sign=verifyMsisdn(number3); printf("%d\n",sign); int sum; for(int i=0;i
} } else { the for(i=1;i<=mid;i++) { output[mid-i]=input[2*i-1]; output[mid+i]=input[2*i]; int mid=n/2; output[mid]=input[0]; for(i=1;i #include #include #include //注意这里输出数组显示,是用 for 循环 printf,显 示,而不能用 cout<<数组名 void sort(int input[], int n, int output[]) { input[] = {3, 6, output[] = {1, 6, 8, 9, 7, int temp; for(int i=0;i= 50 且 <= 255。优先 级大于 255 的为非法任务,应予以剔除。现有一任 务队列 task[],长度为 n,task 中的元素值表示任 务的优先级,数值越小,优先级越高。函数 scheduler 实现如下功能,将 task[] 中的任务按 照系统任务、用户任务依次存放到 system_task[] 数组和 user_task[] 数组中(数组中元素的值是 任务在 task[] 数组中的下标),并且优先级高的 任务排在前面,数组元素为-1 表示结束。 例如:task[] = {5,4,3,2,1,100,50} {1,2,3,4,5,-1} {50,100,-1} system_task[] = user_task[] = (方法一:边插入边用直接插入排序的方法进行排 序,不完善,此处只做了排序,并没有存入想对位 置) void scheduler1(int task[], int n, int system_task[], int user_task[]) { int label1=0,label2=0,i,j=0,k=0; for(i=0;i
} else { system_task[0]=task[i]; label1=1; j++; int m=task[i]; int x=j; if(task[i]0) { system_task[x]=system_task[x-1]; x--; } system_task[x]=m; system_task[j]=m; } else j++; } } else if(task[i]<=255) { if(label2==0) { user_task[0]=task[i]; label2=1; k++; } else { n=task[i]; int int y=k; if(task[i]0) { user_task[y]=user_task[y-1]; y--; } user_task[y]=n; user_task[k]=n; } else k++; } } else if(task[i]>255) { } } system_task[j]=-1; user_task[k]=-1; } void main() { int task[]={5,4,3,2,1,100,50}; int n=7; int system_task[6]; //需要预留-1 的位置,这 里为 6,不能为 5,否则结果有问题 int user_task[3]; //需要预留-1 的位置,这 里为 3,不能为 2,否则结果有问题 scheduler1(task,n,system_task, user_task); for(int i=0;i<6;i++) printf("%3d",system_task[i]); printf("\n"); for(i=0;i<3;i++) printf("%4d",user_task[i]); } (方法二:先分别放在对应的数组中,再排序) #include #include #include #include void scheduler1(int task[], int n, int system_task1[], int user_task1[]) { int i,j=0,k=0,num1=0,num2=0,m; char a[256]={'\0'}; char system_task[256]={'\0'}; char user_task[256]={'\0'}; for(i=0;i255) { } } //下边的代码是显示分完组后的情况 printf("未排序前 system_task[]为:"); for(i=0;i<5;i++) printf(" %3d",system_task[i]); printf("\n"); printf("未排序前 user_task[]为:"); for(i=0;i<2;i++)
分享到:
收藏