2012华为校招上机C&C++试题
1、删除子串,只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数。 #include #include #include #include
int delete_sub_str(const char *str,const char *sub_str,char *result) { assert(str != NULL && sub_str != NULL); const char *p,*q; char *t,*temp; p = str; q = sub_str; t = result; int n,count = 0; n = strlen(q); tmep = (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); return count; }
int main() { char s[100] = {‘\0’}; int num =
delete_sub_str(“123abc12de234fg1hi34j123k”,”123”,s); printf(“The number of sub_str is %d\r\n”,num); printf(“The result string is %s\r\n”,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=1; p=(LinkList *)malloc(sizeof(LinkList)); p->num=i; head=p;
for(i=2;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(
int main() { LinkList *L; int n, m; n=9; m=5; L=creat(n); fun(L,m); return 0; }
3、比较一个数组的元素 是否为回文数组 #include #include
int huiwen(char str[]) { int i,len,k=1; len=strlen(str); for(i=0;i
void main() { char str[100] = {0}; int i; int len;
printf(
q=p; p=p->next; } m=p->num; printf(
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); }
6、 手机号码合法性判断(20分) 问题描述:
我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:[1**********]78。特点如下: 1、 长度13位;
2、 以86的国家码打头;
3、 手机号码的每一位都是数字。
请实现手机号码合法性判断的函数要求: 1) 如果手机号码合法,返回0; 2) 如果手机号码长度不合法,返回1
3) 如果手机号码中包含非数字的字符,返回2; 4) 如果手机号码不是以86打头的,返回3;
【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。 要求实现函数:
int verifyMsisdn(char* inMsisdn)
【输入】 char* inMsisdn,表示输入的手机号码字符串。 【输出】 无
【返回】 判断的结果,类型为int。 示例
输入: inMsisdn = “[1**********]9“ 输出: 无 返回: 1
输入: inMsisdn = “[1**********]789“ 输出: 无 返回: 3
输入: inMsisdn = “[1**********]789“ 输出: 无 返回: 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
int main() { char *pchar=NULL; unsigned char ichar=0; int result; switch(ichar) { case 0: pchar=
result =verifyMsisdn(pchar);
printf(
7、 数组比较(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(
{ struct { char opdata[200]; int top; }opstack; //定义操作符栈 opstack.top = -1; int i=0;//遍历字符串的下标 int t=0;//当前后缀表达式的长度 char ch = expStr[i]; while (ch!='\0') { switch (ch) { case '+': case '-': while (opstack.top != -1) { expStr[t] = opstack.opdata[opstack.top]; opstack.top--; t++; } opstack.top++; opstack.opdata[opstack.top] = ch; break; case '*': case '/': while (opstack.top != -1 && (opstack.opdata[opstack.top] =='*' || opstack.opdata[opstack.top] =='/') ) { expStr[t] = opstack.opdata[opstack.top]; opstack.top--; t++; } opstack.top++; opstack.opdata[opstack.top] = ch; break; default: expStr[t] = ch; t++; break; } i++; ch = expStr[i]; } while (opstack.top != -1)//将栈中所有的剩余的运算符出栈 { expStr[t] = opstack.opdata[opstack.top]; opstack.top--; t++; } expStr[t]='\0'; struct { int numeric[200]; int top; }data; data.top = -1; i=0; ch = expStr[i]; while (ch!='\0') { if (ch>='0' && ch
data.numeric[data.top] = ch-'0'; } else if('+' == ch) { int tmp = data.numeric[data.top-1] + data.numeric[data.top]; data.top--; data.numeric[data.top] = tmp; } else if('-' == ch) { int tmp = data.numeric[data.top-1] - data.numeric[data.top]; data.top--; data.numeric[data.top] = tmp; } else if('*' == ch) { int tmp = data.numeric[data.top-1] * data.numeric[data.top]; data.top--; data.numeric[data.top] = tmp; } else if('/' == ch) { if(data.numeric[data.top] == 0) { printf(
void main() { int array1[] = {1,3,5}; int len1 = 3; int array2[] = {77,21,1,3,5,7}; int len2 = 6; int count = array_compare(sizeof(array1)/sizeof(int),array1,sizeof(array2)/sizeof(int),array2); printf(
printf(
delete [] output_array; printf(
int result = calculate(strlen(expStr),expStr); printf(
9、选秀节目打分,分为专家评委和大众评委,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)
#include #include #include #include #define N 5
int cal_score(int score[], int judge_type[], int n) { int expert=0; int dazhong=0; int zongfen=0; int i; int number=0; for(i=0;i
int main() { int score[N]; int judge_type[N]; int numberlast=0; int i; printf(
printf(
10、给定一个数组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} #include #include #include
void sort(int input[], int n, int output[]) { int i,j; int k=1; int temp; int med; for(i=0;iinput[j+1]) {temp=input[j];input[j]=input[j+1];input[j+1]=temp;} if(n%2!=0) { for(i=0;i
int main() { int a[6]={3,6,1,9,7,8}; int b[6]={0}; for(int i=0;i
printf(
11、操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 = 50且
例如: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[]) #include #include #include #include
void scheduler1(int task[], int n, int system_task[], int user_task[]) { int i; int j=0; int *p,*pp,*p_user,*pp_user; int index=0; int count,count2; int min=0; int k=0; p=(int*)malloc(sizeof(int)*n); for(i=0;i
} else task[i]=task[i]; } for(i=0;i
pp[count]=-1; for(i=0;i
pp_user[count2]=-1; for(i=0;i
int main() { int task[9]={0, 30, 155, 1, 80, 300,170, 40, 99}; int system_task[9]={0};
int user_task[9]={0}; scheduler1(task,9,system_task,user_task); return 0; } 12、 从两个数组的最后一个元素比较两个数组中不同元素的个数,如有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
int compare_array(int len1,int array1[],int len2,int array2[]) { int i,t,small,num=0; //把两数组倒置 for(i=0;i
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); }
13、输入一个字符串,用指针求出字符串的长度。 答案:
#include int main() {
char str[20], *p; int length=0; printf(“Please input a string: ”); gets(str); p=str;
while(*p++) {
length++; }
printf(“The length of string is %d\n”, length); return 0; }
14、使用C语言实现字符串中子字符串的替换
描述:编写一个字符串替换函数,如函数名为 StrReplace(char* strSrc, char* strFind, char* strReplace),strSrc为原字符串,strFind是待替换的字符串,strReplace为替换字符串。 举个直观的例子吧,如:“ABCDEFGHIJKLMNOPQRSTUVWXYZ”这个字符串,把其中的“RST”替换为“ggg”这个字符串,结果就变成了: ABCDEFGHIJKLMNOPQgggUVWXYZ 答案一:
#include #include
void StrReplace(char* strSrc, char* strFind, char* strReplace); #define M 100; void main()
{char s[]=
void StrReplace(char* strSrc, char* strFind, char* strReplace) {
int i=0; int j;
int n=strlen(strSrc); int k=strlen(strFind); for(i=0;i
if(*(strSrc+i)==*strFind) {
for(j=0;j
if(*(strSrc+i+j)==*(strFind+j)) {
*(strSrc+i+j)=*(strReplace+j); }
else continue; } } } }
答案二:
#include #define MAX 100
StrReplace(char *s, char *s1, char *s2) { char *p;
for(; *s; s++) {
for(p = s1; *p && *p != *s; p++); if(*p) *s = *(p - s1 + s2); } }
int main() {
char s[MAX]; //s是原字符串
char s1[MAX], s2[MAX]; //s1是要替换的 //s2是替换字符串 puts(
puts(
puts(
StrReplace(s, s1, s2);
puts(
答案三:
#include #include #include #define M 100
void StrReplace(char* strSrc, char* strFind, char* strReplace); int main() { char s[]=
void StrReplace(char* strSrc, char* strFind, char* strReplace) { while(*strSrc != '\0') { if(*strSrc == *strFind) { if(strncmp(strSrc,strFind,strlen(strFind)) == 0 ) { int i = strlen(strFind); int j = strlen(strReplace); printf(
15、编写一个程序实现功能:将字符串”Computer Secience”赋给一个字符数组,然后从第一个字母开始间隔的输出该串,用指针完成。 答案:
#include #include int main() { char str[]=”Computer Science”; int flag=1; char *p=str; while(*p)
{
if ( flag ) {
printf(“%c”,*p); }
flag = (flag + 1) % 2; p++; } printf(“\n”); return 0; }
16、使用C语言实现字符串中子字符串的替换
描述:编写一个字符串替换函数,如函数名为 StrReplace(char* strSrc, char* strFind, char* strReplace),strSrc为原字符串,strFind是待替换的字符串,strReplace为替换字符串。 举个直观的例子吧,如:“ABCDEFGHIJKLMNOPQRSTUVWXYZ”这个字符串,把其中的“RST”替换为“ggg”这个字符串,结果就变成了: ABCDEFGHIJKLMNOPQgggUVWXYZ 答案一:
#include #include
void StrReplace(char* strSrc, char* strFind, char* strReplace); #define M 100; void main()
{char s[]=
void StrReplace(char* strSrc, char* strFind, char* strReplace) {
int i=0; int j;
int n=strlen(strSrc); int k=strlen(strFind); for(i=0;i
if(*(strSrc+i)==*strFind) {
for(j=0;j
if(*(strSrc+i+j)==*(strFind+j)) {
*(strSrc+i+j)=*(strReplace+j); }
else continue; } } } }
答案二:
#include #define MAX 100
StrReplace(char *s, char *s1, char *s2) { char *p;
for(; *s; s++) {
for(p = s1; *p && *p != *s; p++); if(*p) *s = *(p - s1 + s2); } }
int main() {
char s[MAX]; //s是原字符串 char s1[MAX], s2[MAX]; //s1是要替换的 //s2是替换字符串 puts(
puts(
puts(
StrReplace(s, s1, s2);
puts(
答案三:
#include #include #include #define M 100
void StrReplace(char* strSrc, char* strFind, char* strReplace); int main() { char s[]=
void StrReplace(char* strSrc, char* strFind, char* strReplace) { while(*strSrc != '\0') { if(*strSrc == *strFind) { if(strncmp(strSrc,strFind,strlen(strFind)) == 0 ) { int i = strlen(strFind); int j = strlen(strReplace); printf(
}
} }
17、编写一个程序实现功能:将两个字符串合并为一个字符串并且输出,用指针实现。
char str1[20]={“Hello ”}, str2[20]={“World ”}; 答案:
#include
int main() {
char str1[20]={“Hello ”}, str2[20]={“World ”}; char *p=str1, *q=str2;
while( *p ) p++; while( *q ) {
*p = *q; p++; q++; }
*p = ‘\0’;
printf(“%s\n”, str1);
return 0; }
18、算分数的问题,去掉一个最高分一个最低分,求平均分
1. #include
2. float avescore(float score[],int n) 3. {
4. float min=0; 5. float max=0; 6. int minindex=0; 7. int maxindex=0; 8. float sum=0; 9. min=score[0];
10. for(int i=0;i
13. min=score[i]; 14. minindex=i; 15. }
16. score[minindex]=0; 17. max=score[0]; 18. for(i=0;i
19. if(score[i]>max) 20. {
21. max=score[i];
22. maxindex=i;
23. }
24. score[maxindex]=0; 25. for(i=0;i
27. sum=sum/(n-2); 28. return sum;
29. }
30. void main() 31. {
32. float score[6]={70,80,90,98,87,86};
33. float lastscore;
34. lastscore=avescore(score,6);
35. printf(
运行结果:
the last score is :85.75 19、对一个数组,将数组中偶数从大到小排序,奇数从小到大排序,奇数和偶数交叉着放且输出数组第一位放奇数 若奇数和偶数不等长,则把剩下的直接放到数组中。 思路:先进行奇偶判断,得到奇数和偶数数组。然后对两数组排序,进行长度判断,最后组织数据。
#include
1. #include 2.
3. void jiou(int a[],int n) 4. {
51. for(i=0;i
52. for(j=0;j
t1-i;j++)
53. if(p1[
j]
54. {temp=
p1[j];p1[j]=p1[j+1];p1[j+1]=temp;}
55. for(i=
0;i
56.
printf(
57. printf
(
58. 59. 5. int *p1; 6. int *p2; 7. int i,j; 8. int k=0; 9. int kk=0;
10. int count1=0; 11. int count2=0; 12. int temp; 13. int temp2; 14. int m=0;
15. p1=(int*)malloc(sizeof(int)*n); 16. p2=(int*)malloc(sizeof(int)*n); 17. for(i=0;i
19. p1[i]=0; 20. p2[i]=0; 21. } 22.
23. for(i=0;i
25.
26. if((a[i]%2)!=0) 27. {p2[kk++]=a[i];} 28. else
29. {p1[k++]=a[i];} 30. }
31. count1=k; 32. count2=kk; 33.
34. for(i=0;i
35. printf(
38. for(i=0;i
39. for(j=0;jp2[j+1]) 41. {temp2=p2[j];p2[j]=p2[
j+1];p2[j+1]=temp2;}
42. for(i=0;i
43. printf(
2[i]);
44. printf(
46. for(i=0;i
47. printf(
1[i]);
48. printf(
62.
63. 64. for(i=0;i
65. {
66. a[i+m]=p2[i];
67. a[i+1+m]=p1[i];
68. m=m+1;
69. }
70. for(i=0;i
71. a[2*count2+i]=p1[i+count2]; 72.
73. 74.
75. 76. for(i=0;i
77. {
78. a[i+m]=p2[i];
79. a[i+1+m]=p1[i];
80. m=m+1;
81.
82. }
83. for(i=0;i
84. a[2*count1+i]=p2[i+count1]; 85.
86. 87. 0;i
if(cou
{
} else
{
} for(i=
88.
printf(
89. printf
(
92. void main() 93. {
94. int a[10]={2,3,14,6,2,15,12,14,4,11};
95. jiou(a,10); 96. 97. }
运行结果: 3 15 11 3 11 15
2 14 6 2 12 14 4 14 14 12 6 4 2 2
3 14 11 14 15 12 6 4
2 2