部分华为校园招聘机试试题及答案(C语言版本)

1.
密码截取
描述: Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?
运行时间限制: 无限制
内存限制: 无限制
输入: 字符串-密码内容
输出: 整形数-有效密码串最大长度
样例输入: ABBA
样例输出: 4
答案提示:  

#include
int DuiCheng(char *ch,int len);
int main(void){
char ch[20]="0",temp = '0';
int max=0,i=0,len;


i=0;
scanf("%c",&temp);
while(temp!='\n'){
ch[i] = temp;
i++;
scanf("%c",&temp);
}
len = i;


max = DuiCheng(ch,len);
printf("%d\n",max);
return 0;
}


int DuiCheng(char *ch,int len){
int max=0,count=0,i,j,k,flag=0;


for (i=0; i for (j=i+1; j count = 0;
for (k=0; k<(1+(j-i+1)/2); k++){
if(ch[i+k]==ch[j-k])
count++;
}
if( count == (1+(j-i+1)/2) )
if(max max = j-i+1;
}
}


return max;
}






2.
求一个int型整数的两种递减数之和
描述: 给出一个整数(负数使用其绝对值),输出这个整数中的两种递减数(1.最大递减数;2.递减数中各位数之和最大的数)之和。


递减数:一个数字的递减数是指相邻的数位从大到小排列的数字,不包含相邻的数位大小相同的情况。


最大递减数:所输入整数的所有递减数中值最大的一个。 如: 75345323,递减数有:75,753,53,53,532,32。那么最大的递减数为753。


各位数字之和最大的递减数: 如75345323中的各递减数:75各位数之和=12(7+5=12),753各位数之和=15(7+5+3=15),53各位数之和=8(5+3=8),532各位数之和=10(5+3+2=10),32各位数之和=5(3+2=5)。那么各位数字之和最大的递减数为753。


输出结果=最大递减数+各位数之和最大的递减数。(1506=753+753)
运行时间限制: 无限制
内存限制: 无限制
输入: 一个int型整数。如:75345323
输出: 一个int型整数。如:1506
 
样例输入: 75345323
样例输出: 1506
答案提示:  

//一个数字的递减数是指
//[相邻的数位]从大到小排列的数字,如756中的75
//不包含[相邻的数位]大小相同的情况,如75564中的55,递减数是75,64。
// 如: 753 4 532 3,递减数有:a:75,753,53, b:53,532,32。那么最大的递减数为753。
//1.最大递减数
//2.各位数字之和最大的递减数

#include

int Max(int *a, int len);
void show(int *a, int len);

int main(void){
int a[10] = {0},d[100] = {0},dh[100]={0};
int i,j,n,len,temp,max1,max2;

scanf("%d", &n);

if(n<0)
n = n*(-1);

i=0;
while(n>0){
a[i] = n%10;
i++;
n = n/10;
}
len = i;

j=0;
i = len-1;
while(i>0){
if(a[i]>a[j]){

temp = a[i];
dh[j] = a[i];
while(a[i]>a[i-1]){
temp = temp*10 + a[i-1];
dh[j] = dh[j]+a[i-1];//递减数之和
i--;
}
d[j] = temp;//最大递减数
j++;
}else{
i--;
}
}

max1 = Max(d,j);
max2 = Max(dh,j);

printf("d[max1] = %d\n",d[max1]);
printf("d[max2] = %d\n",d[max2]);
printf("d[max1]+d[max2] = %d\n",d[max1]+d[max2]);

return 0;
}

int Max(int *a, int len){
int i,max,j;
max = a[0];
for(i=0;i if(max max = a[i];
}

for(i=0;i if(max==a[i])
break;
}

return i;
}

void show(int *a, int len){
int i;
for(i=0;i printf("%d ",a[i]);
}
printf("\n");
}


3.最小长方形
描述: 给定一系列2维平面点的坐标(x, y),其中x和y均为整数,要求用一个最小的长方形框将所有点框在内。
长方形框的边分别平行于x和y坐标轴,点落在边上也算是被框在内。
运行时间限制: 10 Sec
内存限制: 128 MByte
输入: 测试输入包含若干测试用例,每个测试用例由一系列坐标组成,每对坐标(x y) 占一行,其中|x|和|y|小于 1000;
一对(0,0) 坐标标志着一个测试用例的结束。注意(0, 0)不作为任何一个测试用例里面的点。一个没有点的测试用例标志
着整个输入的结束。
输出: 对每个测试用例,在1行内输出2对整数,其间用一个空格隔开。第1对整数是长方形框左下角的坐标,
第2对整数是长方形框右上角的坐标。
如果只是一个点或者一条线,不输出。例如:
12 34
0 0
只是一个点,不是长方形,不输出。
样例输入: 12 56
23 56
13 10
0 0
12 34
0 0
0 0
样例输出: 12 10 23 56

#include

int main(void){
int x[100]={0},y[100]={0};
int MinX[100]={0},MinY[100]={0},MaxX[100]={0},MaxY[100]={0};
int i, j;
int len=0, m, flag;
int flag1,flag2;
m = 1;
while (m!=0)
{
m = 0;
flag = 1;
while ( flag )
{
scanf("%d %d\n", &x[m], &y[m]);
if ((x[m]==0) && (y[m]==0))
flag = 0;
else
m++;
}

flag1 = 0;
flag2 = 0;
for (i=0; i for (j=i+1; j if ( x[i] !=  x[j])
  flag1 = 1;
if ( y[i] !=  y[j])
  flag2 = 1;
}
}

if (m>1 && flag1 && flag2){
MinX[len]=1000;
MinY[len]=1000;
MaxX[len]=0;
MaxY[len]=0;
for (i=0; i if (MinX[len] > x[i]) MinX[len] = x[i];
if (MinY[len] > y[i]) MinY[len] = y[i];

if (MaxX[len] < x[i]) MaxX[len] = x[i];
if (MaxY[len] < y[i]) MaxY[len] = y[i];
}
len++;
}
}

for (i=0;i printf("%d %d %d %d\n",MinX[i],MinY[i],MaxX[i],MaxY[i]);
}

return 0;
}

4.判断一个数字中是否包含两个相同的子串
描述:
判断给定的一个数字,把它当成字符串以后,该字符串中是否包含相同的两个子串,子串的长度要求大于等于2。
比如:12123,该数字包含两个“12”子串;
又比如:1223122,该数字包含两个“122”子串。
 
运行时间限制: 无限制
内存限制: 无限制
输入:
待判断的正整型数字,最大长度为9。
输出:
0:不包含;
1:包含。
 
样例输入:
12123
样例输出:
1
答案提示:




#include
#include


int Same(char b[9][9], int len);
int main(void){
char ch[100]="0",temp='0',b[9][9]={"0"};
int i, j, s, k,len, flag=0;

gets(ch);
len =strlen(ch);
printf("len = %d \n",len);
printf("ch = %s \n",ch);
for(s=2;s //字串长度从2到len
k = 0;
for(i=0;i strncpy(b[k],ch+i,s);
b[k][s] = '\0';
k++;
}

if (Same(b,k)){
printf("1\n");
return 0;
}
}
printf("0\n");
return 0;
}

int Same(char b[9][9], int len){
int i,j,flag=0;
for(i=0;i for(j=i+1;j if(!strcmp(b[i],b[j])){
flag = 1;
return flag;
}
}
}
return flag;
}

5.【测试自动化6】城市电话号码
描述:
某城市电话号码由三部分组成,分别是:
地区码:空白或者三位数字;
前缀:非0开头的三位数字
后缀:4位数字
假定被测程序能接受一切符合上述规定的电话号码,输出0
 拒绝一切不符合规定的电话号码,输出1.
请编写程序实现上述描述的功能.
 
运行时间限制: 10 Sec
内存限制: 200 MByte
输入:
地区码:空白或者三位数字;
前缀:非0开头的三位数字
后缀:4位数字
 
输出:
0或者1
 
样例输入:
111
111
1111
样例输出:
0

#include
#include

int main(void){
int b = 0, flagA=0,flagB=0,flagH=0,len=0;
char a[10] = "\0",h[10] = "\0",ch='\0';

scanf("%c", &ch);
if (ch=='\n'){
flagA = 0;
}else{
scanf("%s", &a);
len = strlen(a);
if(ch>='0' && ch<='9'&& len == 2)
flagA = fun(a,2);
else
flagA = 1;
}

scanf("%d", &b);
scanf("%s", &h);


if (b>=100 && b<=999)
flagB = 0;
else
flagB = 1;


len = strlen(h);
if(len==4)
flagH = fun(h,4);
else
flagH = 1;

if(!flagA && !flagB && !flagH)
printf("0\n");
else
printf("1\n");
return 0;
}

int fun(char *ch, int len){
int flag=0, i=0;
for(i=0;i if(ch[i]>='0' && ch[i]<='9'){
flag = 0;
}else{
flag = 1;
break;
}
}

return flag;
}

6.超长正整数相加
描述:
题目描述:请设计一个算法完成两个超长正整数的加法。 
要求实现函数:
  void AddLongInteger(char * pcAddend, char * pcAugend, char * pcAddResult);
输入参数:
        char * pcAddend:加数
        char * pcAugend:被加数
        char * pcAddResult:加法结果
返回值:无
运行时间限制: 1 Sec
内存限制: 128 MByte
输入:
两个超长正整数的字符串
输出:
相加后结果的字符串
样例输入:
123456789123456789 123456789123456789
样例输出:
246913578246913578
答案提示:
 
#include
#include
void AddLongInteger(char * pcAddend, char * pcAugend, char * pcAddResult);
void AddLongInteger2(char * a, char * b, int len1, int len2, char * c);
int main(void){
char pcAddend[100] = "0";
char pcAugend[100] = "0";
char pcAddResult[100] = "0";
scanf("%s",&pcAddend);
scanf("%s",&pcAugend);
AddLongInteger(pcAddend, pcAugend, pcAddResult);

return 0;
}

void AddLongInteger(char * pcAddend, char * pcAugend, char * pcAddResult){
int len1=0,len2=0;

len1 = strlen(pcAddend);
len2 = strlen(pcAugend);

if(len1>=len2){
AddLongInteger2(pcAddend, pcAugend, len1, len2, pcAddResult);
}else{
AddLongInteger2(pcAugend, pcAddend, len2, len1, pcAddResult);
}

printf("%s\n", pcAddResult);
}

void AddLongInteger2(char * a, char * b, int len1, int len2, char * c){
int m1,m2,flag=0,answer[100] = {0};

int i,j,k=0;

for (i=len1-1,j=len2-1;i>=0;i--,j--){
m1 = (int)a[i] - 48;
if(j>=0)
m2 = (int)b[j] -48;
else
m2 = 0;
if (flag==1){
m1++;
flag = 0;
}

if(m1+m2<10){
answer[k] = m1+m2;
k++;
flag = 0;
}else{
answer[k] = m1+m2-10;
k++;
flag = 1;
}
}
if (flag==1){
answer[k] = 1;
k++;
}
for(i=k-1,j=0;i>=0;i--,j++){
c[j]=(char)(answer[i]+48);
}
}
 
 7.删除重复的数值
 描述:将一个整型数组中的各个值进行比对,删除重复的数值并向前对齐;
 输入:多行,每行一组数据,用","隔开,其最大长度小宇4096个字符。
 输出:多行,每行对应删除重复后的结果。
 样例输入:3,5,4,5,3
  9,9,10,2,3,10,21,2,10
 样例输出:3,5,4
  9,10,2,3,21
#include

void printArr(int a[],int len){
    int i;
    for(i=0;i         printf("%d,",a[i]);
    }
    printf("%d\n",a[i]);
}


int in_array(int a[],int p,int len){
    int i;
    for(i=0;i         if(a[i]==p){
            return 1;
        }
    }

    return 0;
}

int main(void){
int a[4096]={0};
int i,j,flag,temp=0,len;
char ch = '0';

while(1){
i=0;
ch = '0';
while(ch!='\n'){
flag = 0;
scanf("%d%c",&temp,&ch);
flag = in_array(a,temp,i);
if(!flag){
a[i] = temp;
i++;
}
}
len = i;


printArr(a,len);
}

return 0;
}


#include
#include
#define MAX_SIZE 4096
 
void printArr(int a[],int len){
    int i;
    for(i=0;i         printf("%d,",a[i]);
    }
    printf("%d\n",a[i]);
}


 
int in_array(int a[],int p,int len){
    int i;
    for(i=0;i

        if(a[i]==p){


            return 1;
        }
    }


    return 0;
}
 
 
void del(int a[],int len){
int b[MAX_SIZE]={0};
    int i,j=0;
    for(i=0;i         if(!in_array(b,a[i],len)){
            b[j]=a[i];
            j++;
        }
    }
    printArr(b,j);
}
 
int main(){
    int a[MAX_SIZE];
    int i=0;
    char c;
    while(scanf("%d",&a[i])!=EOF){
        i++;
        c=getchar();
        if(c== '\n'){
            del(a,i);


            i=0;
        }
    }
 
    return 1;
}



你可能感兴趣的:(C语言)