//编写一个函数,删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。 格式说明: 字符串只包含字母,不可能为空串,不包含空格,单词只由小写英文字母组成,输入的字符串长度不会超过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
-
- //【题目】华为2013校园招聘机试题目题4:删除一个字符串中出现次数最少的字符,函数原型为:char * delChar(char *s,int iLen)
- //【输入】s为输入字符串,iLen为输入字符串长度
- // 如输入字符串为“abcdd”,输出为"dd"
- // 字符串中只有小写字母,不含空格且字符串最大长度不超过20