题目要求:
删除与某个字符相邻且相同的字符,如,abcddef,删除相邻的相同字符d后变为: abcdef。
要求:输入字符串,输出删除后的结果。
咋一看,这个题目很简单,是历年全国计算机等级考试必考的题目之一,每年两次监考的时候就能看到这个题目。有些同学很快就做完,但有些不得要领不懂题意的同学也会抓耳挠腮。然而,今天面试,却让我丢大了人,没想到我也会卡壳,真是郁闷,这在平时可是在三五分钟三五行程序就搞定的事,不知今天哪根神经犯了毛病,一开始就想高明一把,用指针,而且还莫名其妙地写了个两重循环的,简单问题复杂化,一下子思路就不对了。最终还是在面试官的再三追问下我才发现我的程序不对。后来在这位面试官问我单重循环行不行,我才一下子想到,才三五分钟搞定。呵呵,不过在纸上写程序,还真是不习惯,但这更能够考察一个编程人员的功底。
现在把这个简单的程序贴出来,给各位要面试的朋友一点点提醒。:)不过,我想,绝大多数是不需要的,只有一个人需要,那个人就是我自己。
代码如下:
/**//************************************************************************
* 删除与某个字符相邻且相同的字符
* 如,abcddef,删除相邻的相同字符d后变为: abcdef
* 要求,输入字符串,输出删除后的结果
************************************************************************/
#include <stdio.h>
#include <string.h>
#define MAXCOUNT 100
//用数组,不用指针
char *delete_adjacent_char1(char *str)
...{
if(str==NULL)
return NULL;
int i=0,j=0;
int len=strlen(str);
for(j=i+1;j<len;j++)
...{
if(str[i]!=str[j])
str[++i]=str[j];
}
str[i+1]=0;
return str;
}
//2,3相同,只不过一个用while一个用for
char *delete_adjacent_char2(char *str)
...{
if(str==NULL)
return NULL;
char *p=str;
char *q=p+1;
while(*q)
...{
if(*p!=*q)
...{
p++;
*p=*q;
q++;
}
else
...{
q++;
}
}
*(p+1)=0;
return str;
}
//用for代码简洁
char *delete_adjacent_char3(char *str)
...{
if(str==NULL)
return NULL;
char *p=str;
char *q=p+1;
for(;*q;q++)
...{
if(*p!=*q)
...{
p++;
*p=*q;
}
}
*(p+1)=0;
return str;
}
//显示菜单
void show_menu()
...{
printf("---------------------------------------------");
printf("input command to test the program");
printf(" a or A : select func 1 to test");
printf(" b or B : select func 2 to test");
printf(" c or C : select func 3 to test");
printf(" q or Q : quit");
printf("---------------------------------------------");
printf("$ input command >");
}
void main()
...{
char sinput[10];
char str[MAXCOUNT];
show_menu();
scanf("%s",sinput);
while(stricmp(sinput,"q")!=0)
...{
if(stricmp(sinput,"a")==0 || stricmp(sinput,"b")==0 || stricmp(sinput,"c")==0)
...{
printf(" please input an string:");
scanf("%s",&str);
printf(" before deletion: %s",str);
char *pstr;
if(stricmp(sinput,"a")==0)
pstr=delete_adjacent_char1(str);
else if(stricmp(sinput,"b")==0)
pstr=delete_adjacent_char2(str);
else if(stricmp(sinput,"c")==0)
pstr=delete_adjacent_char3(str);
printf(" after deletion: %s",pstr);
}
//输入命令
printf("$ input command >");
scanf("%s",sinput);
}
}
* 删除与某个字符相邻且相同的字符
* 如,abcddef,删除相邻的相同字符d后变为: abcdef
* 要求,输入字符串,输出删除后的结果
************************************************************************/
#include <stdio.h>
#include <string.h>
#define MAXCOUNT 100
//用数组,不用指针
char *delete_adjacent_char1(char *str)
...{
if(str==NULL)
return NULL;
int i=0,j=0;
int len=strlen(str);
for(j=i+1;j<len;j++)
...{
if(str[i]!=str[j])
str[++i]=str[j];
}
str[i+1]=0;
return str;
}
//2,3相同,只不过一个用while一个用for
char *delete_adjacent_char2(char *str)
...{
if(str==NULL)
return NULL;
char *p=str;
char *q=p+1;
while(*q)
...{
if(*p!=*q)
...{
p++;
*p=*q;
q++;
}
else
...{
q++;
}
}
*(p+1)=0;
return str;
}
//用for代码简洁
char *delete_adjacent_char3(char *str)
...{
if(str==NULL)
return NULL;
char *p=str;
char *q=p+1;
for(;*q;q++)
...{
if(*p!=*q)
...{
p++;
*p=*q;
}
}
*(p+1)=0;
return str;
}
//显示菜单
void show_menu()
...{
printf("---------------------------------------------");
printf("input command to test the program");
printf(" a or A : select func 1 to test");
printf(" b or B : select func 2 to test");
printf(" c or C : select func 3 to test");
printf(" q or Q : quit");
printf("---------------------------------------------");
printf("$ input command >");
}
void main()
...{
char sinput[10];
char str[MAXCOUNT];
show_menu();
scanf("%s",sinput);
while(stricmp(sinput,"q")!=0)
...{
if(stricmp(sinput,"a")==0 || stricmp(sinput,"b")==0 || stricmp(sinput,"c")==0)
...{
printf(" please input an string:");
scanf("%s",&str);
printf(" before deletion: %s",str);
char *pstr;
if(stricmp(sinput,"a")==0)
pstr=delete_adjacent_char1(str);
else if(stricmp(sinput,"b")==0)
pstr=delete_adjacent_char2(str);
else if(stricmp(sinput,"c")==0)
pstr=delete_adjacent_char3(str);
printf(" after deletion: %s",pstr);
}
//输入命令
printf("$ input command >");
scanf("%s",sinput);
}
}