//ex1_function2.cpp
// 源作者:曹玲玲 编于2012-09-12
//【题目】华为2013校园招聘机试题目题4:删除一个字符串中出现次数最少的字符,函数原型为:char * delChar(char *s,int iLen)
//【输入】s为输入字符串,iLen为输入字符串长度
// 如输入字符串为“abcdd”,输出为"dd"
// 字符串中只有小写字母,不含空格且字符串最大长度不超过20
#include
#include
#define MAX 20
//判断字符S是否在字符串visit中,是返回位置,不是返回-1
int whetherInVisit(char s,char* visit)
{
int i=0;
while(visit[i]!='\0')
{
if (visit[i]==s)
return i;
else
i++;
}
return -1;
}
//判断数i,是否是数组array中的最小数,是返回1,不是返回0
int whetherIsMini(unsigned int i,unsigned int * array,unsigned int aLen)
{
unsigned int temp=0;
for(temp=0;temp
{
if (i>array[temp])
return 0;
}
return 1;
}
char* delChar(char *s,int iLen)
{
unsigned int Count[MAX];//存放各字符出现的次数
char visit[MAX];//已出现字符的存储
int i=0,Len_visit=0,posotion,j=0;
char * ReStr=(char *)malloc(MAX+1);//存放删除后的字符串
visit[0]='\0';
//统计各个字符出现的次数
for (i=0;i
{
posotion=whetherInVisit(s[i],visit);
if(posotion==-1)
{
Count[Len_visit]=1;
visit[Len_visit]=s[i];
Len_visit++;
visit[Len_visit]='\0';
}
else
{
Count[posotion]++;
}
}
//删除字符
for (i=0;i
{
posotion=whetherInVisit(s[i],visit);//查找其位置,用于读取其出现的次数
if(whetherIsMini(Count[posotion],Count,Len_visit)==0)//不是次数最少的
{
ReStr[j]=s[i];
j++;
}
}
ReStr[j]='\0';
return ReStr;
}
void delChar_Main()
{
char s[MAX];
int iLen=0,i=0;
char *NEW;
printf("请输入一组字符串,最长为20个字符\n");
while (gets(s)!=NULL)
{
while(s[i]!='\0')
{
iLen++;
i++;
}
NEW=delChar(s,iLen);
printf("删除最少字符后为:\n");
puts(NEW);
printf("\n请输入下一组字符串,最长为20个字符,输入其他字符退出\n");
}
}
运行结果
参考:
#include
#include
#include
char *delChar(char *s,int iLen) ;
int main(void)
{
char str[] = "abadccdehigiktk";
int iLen = strlen(str)/sizeof(char);
char *tmp = delChar(str,iLen);
printf("%s\n",tmp);
return 0;
}
char *delChar(char *s,int iLen)
{
if (NULL == s || iLen
{
return NULL;
}
int i = 0;
const int MAXLEN = 26;
int min, nCountTable[MAXLEN];
for (i = 0; i
{
nCountTable[i] = 0;
}
for (i = 0; i
{
(nCountTable[*(s+i) - 'a'])++;
}
for (i = 0; i
{
printf("=", nCountTable[i]);
}
putchar('\n');
i = 0;
//找出数组中的一个不等于0的值
while(nCountTable[i] == 0)
{
i++;
}
min = nCountTable[i];
for (i = 0; i
{
if (nCountTable[i] != 0)
{
if (nCountTable[i]
{
min = nCountTable[i];
}
}
}
char *temp;
i = 0;
temp = (char *) malloc(iLen * sizeof(char));
while(*s != '\0')
{
if (nCountTable[*s - 'a'] != min)
{
*(temp + i) = *s;
i++;
}
s++;
}
*(temp + i) = '\0';
return temp;
}
【思考】
第二种方法更好,因为26个字母且没有大写问题,更有针对性,简洁方便