用c语言删除出现次数最少的字符串,【C编程练习】华为2013校园招聘机试题目题4:删除一个字符串中出现次数最少的字符...

//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");

}

}

运行结果

a4c26d1e5885305701be709a3d33442f.png

参考:

#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个字母且没有大写问题,更有针对性,简洁方便

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值