编写一个函数,删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。

//编写一个函数,删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。 格式说明: 字符串只包含字母,不可能为空串,不包含空格,单词只由小写英文字母组成,输入的字符串长度不会超过20个char 。


//算法思路:
//(1)定义一个长度为26的整型数组,每个字母出现的次数存在这个数组中。
//(2)求出数组中的最小值即字符串中字符出现的最小次数min(最小次数为1,从前往后去比较大小,找出最小值)。
//(3)定义一个空字符数组用来保存新字符串(将出现次数大于min的字符按照顺序存入空数组中,并在末尾加上字符串结束标志'')。
//(4)算法结束。


需要注意的细节:字符串处理后,返回时,需要把指针指向字符串首位置,这里犯了错,调试了好久才找到错误。我们以后写malloc的时候,给它两个指针,一个就表示头部,另外一个参与运算。这类错误就不会犯了

因为网络上题目只是说了个大概,华为原意给了函数模板的,直接写就行,但是我看到的题目是网友记忆版本,没有写要编写的函数头,所以我用了2重指针。

后来想到的一些:

main里最后最好加上free

 最好把strlen放在循环外面,否则每次都会运行strlen,增加时间消耗

代码如下:


#include<iostream>  
using namespace std;  
char *check (char *str,char **re)  
{  
    int count[26];    //计数器  
    int min=20;         //初始化  
    *re=(char *)malloc(sizeof(char)*(strlen(str)+1));  
	char *copy=*re;
    for(int i=0;i<26;i++)  
    {  
        count[i]=0;  
    }  
    for(unsigned int i=0;i<strlen(str);i++)  
    {  
        (count[str[i]-'a'])++;  
    }  
    //打擂法,找最小值  
    for(int i=0;i<26;i++)  
    {  
        if((count[i]<min) && (count[i]!=0))  
            min=count[i];  
    }  
    //删除最小的,重构字符串  
    for(unsigned int i=0;i<strlen(str);i++)  
    {  
        if((count[str[i]-'a'])!=min)  
        {  
            *copy=str[i];  
            copy++;  
        }  
    } 
    *copy='\0'; //此时copy指针指向字符串尾
    return *re;  //返回字符串开头的首地址,这里容易出错
}  
int main()  
{  
    char str[20];  
    gets(str);  
    char *re=NULL;  
    cout<<endl;       
    cout<<check(str,&re)<<endl;  
    system("pause");  
    return 0;  
}  


按照华为功能函数使用1重指针重新编写后:

注意:

对于char *delChar (char *s,int iLen)
输入的指针s,改变其对应的空间里面的内容。

即对于主函数来说,str对应的值,通过条用char *delChar (char *s,int iLen)函数后被修改了

#include<iostream>  
using namespace std;  
char *delChar (char *s,int iLen) 
{
	int count[26],min=20;//定义计数器
	char *re=s;
	int num=0;
	for(int i=0;i<26;i++)
	{
		count[i]=0;
	}
	for(int i=0;i<iLen;i++)
	{
		(count[s[i]-'a'])++;
	}
	for(int i=0;i<26;i++)
	{
		if((count[i]<min) && (count[i]!=0))
			min=count[i];
	}
	for(int i=0;i<iLen;i++)
	{
		if((count[s[i]-'a'])!=min)
		{
			re[num]=s[i];
			num++;
		}
	}
	re[num]='\0';
	return s;
}
int main()  
{  
    char str[20];  
    gets(str);   
    cout<<endl;
	int iLen=strlen(str);
    cout<<delChar(str,iLen)<<endl; 
    system("pause");  
    return 0;  
}  



代码风格:http://m.blog.csdn.net/blog/bytxl/38614113




  1. //【题目】华为2013校园招聘机试题目题4:删除一个字符串中出现次数最少的字符,函数原型为:char *  delChar(char *s,int iLen)   
  2. //【输入】s为输入字符串,iLen为输入字符串长度  
  3. //        如输入字符串为“abcdd”,输出为"dd"  
  4. //        字符串中只有小写字母,不含空格且字符串最大长度不超过20   

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值