【华为OJ】删除一个字符串中出现次数最少的字符

描述: 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。

知识点: 字符串

题目来源: 内部整理

练习阶段: 中级

运行时间限制: 无限制

内存限制: 无限制

输入:

字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。

输出:

删除字符串中出现次数最少的字符后的字符串。

样例输入: abcdd

样例输出: dd

——*——

#include<iostream>#include<stdio.h>#include<string.h>using namespace std;#define maxsize 100//判断字符S是否在字符串visit中,是返回位置,否则返回1int whethervisit(char c,char visit[]){int i=0;while(visit[i]!='\0'){if(visit[i]==c)return i;elsei++;}return -1;}//判断数据s_count是不是字符串count中最少的,是返回1,否则返回0int whethermin(unsigned int s_count,unsigned int count[],int len){unsigned int t=0;for(t=0;t<len;t++){if(s_count>count[t])//不是最少的return 0;}return 1;//是最少的}char *delmostchar(char c[]){//int whethervisit(char c,char visit[]);//int whethermin(unsigned int s_count,unsigned int count[],int len);unsigned int count[maxsize];//存放各字符出现的次数char visit[maxsize];//存放已出现的字符int i=0,len_visit=0,position=0,j=0;char *newstring=(char *)malloc(maxsize+1);//存放删除后的字符串int len= strlen(c);//统计各个字符和其出现的次数for(i=0;i<len;i++){position=whethervisit(c[i],visit);if(position==-1)//如果c[i]在visit数组中不存在{count[len_visit]=1;visit[len_visit]=c[i];len_visit++;visit[len_visit]='\0';}else//如果c[i]在visit数组中已经存在{count[position]++;}}//删除字符for(i=0;i<len;i++){position=whethervisit(c[i],visit);//查找c[i]在visit数组中的位置,用于读取出现次数if(whethermin(count[position],count,len_visit)==0)//不是次数最少的{newstring[j]=c[i];j++;}}newstring[j]='\0';return newstring;}int main(){char *delmostchar(char c[]);int whethervisit(char c,char visit[]);int whethermin(unsigned int s_count,unsigned int count[],int len);char c[maxsize];//cout<<"输入一个字符串"<<endl;gets(c);char *newc;newc=delmostchar(c);cout<<newc<<endl;return 0;}注意:

1、在自定义函数char *delmostchar(char c[])中:

初始定义char newstring[maxsize];

结果在自定义函数最后返回的时候,出现warning,即,不可以将数组作为返回值给指针类型。

这个warning在VC中没事,依旧可以运行出结果,但在【华为OJ】平台时,则是运行出错。

更改定义如下:

char *newstring=(char *)malloc(maxsize+1);//存放删除后的字符串

2、malloc函数

Malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void*类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。

原型:extern void *malloc(unsigned int num_bytes);

功能:分配长度为num_bytes字节的内存块

返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。

3、定义char *newstring;//不用malloc函数为其分配存储空间会出错=(char *)malloc(maxsize+1);//存放删除后的字符串

因为指针用malloc分配空间后就等于数组,本文的main函数中要输出:

char *newc;newc=delmostchar(c);如果自定义函数char *delmostchar(char c[])的返回指针不限定空间,那么指针输出的结果将是无穷的。

联系朋友别欠费,天空辽阔任你飞,再多困难别后退! “

【华为OJ】删除一个字符串中出现次数最少的字符

相关文章:

你感兴趣的文章:

标签云: