//增加难度,并返回最大值和次大值得个数
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
struct word_frequency
{
int max;
int sec;
};//不要忘记分号
int equal(const char * st1,const char * st2)
{
if (strcmp(st1,st2)==0)
return 1;
else
return 0;
}
word_frequency PickWord(const char* pInPut,char *pOutPut1,char *pOutPut2)
{
char tem[BUFSIZ][40]={'\0'};
word_frequency data;
data.max=0;
data.sec=0;
const char *p=pInPut;
int j=0;
int i=0;
int l=0;
char *po1=pOutPut1;
char *po2=pOutPut2;
//用二维数组存储单词
while(*p!='\0')
{
if(((*p>='a')&&(*p<='z'))||((*p>='A')&&(*p<='Z'))||(*p=='\''))//最后一个是单’,缩写算是一个单词
{
tem[j][i++]=*p ;
p++;
}
else //碰见非字母字符,判断为单词之间的间隔
{
tem[j][i]='\0';
j++; //j记录单词个数
p++;
i=0; //i下标的作用始终是从单词开头指向单词结尾
}
}
int m,n,max1,max2;
int max[BUFSIZ]={0};
//统计每个单词的次数
for (n=0;n<=j;n++) //遍历得到的所有单词
{
max[n]=0;
for(m=0;m<=j;m++)
{
max[n]+=equal(tem[n],tem[m]); //两轮循环,依次判断所得单词相同与否
}
}
//找出最多的单词
max1=0;
max2=0;
for (n=0;n<=j;n++)
{
if (max[n]>max1) //max[n]里边的信息是单词出现的个数,同时n是单词的标志位,区别于其他单词
{
max1=max[n];
i=n; // i 保存着最大值下标
}
}
//统计单词出现的最多次数
for (n=0;n<=j;n++)
{
if (max[n]==max1)
{
//max1=max[n];
data.max++;
}
}
for (l=0;l<strlen(tem[i]);l++) //tem[i]表示第i个也是第n个单词及出现次数最多的单词,strlen(tem[i])为该单词长度
{
*pOutPut1++=tem[i][l];
}
*pOutPut1='\0';
//将最多的单词的统计个数置0
for (n=0;n<=j;n++) //遍历所有单词
{
if ((max[n]==max1)&&equal(tem[n],po1))
max[n]=0;
}
//找出次多的单词
for (n=0;n<=j;n++)
{
if (max[n]>max2)
{
max2=max[n];
i=n;
}
}
//找出出现次多的单词的个数
for (n=0;n<=j;n++)
{
if (max[n]==max2)
{
data.sec++;
}
}
for (l=0;l<strlen(tem[i]);l++)
{
*pOutPut2++=tem[i][l];
}
*pOutPut2='\0';
return data;
}
int main()
{
const char a[]="I believe I can Fly!I can do it and I can do better!";
char* b=(char *)malloc(sizeof(char)*40);
char* c=(char *)malloc(sizeof(char)*40);
PickWord(a,b,c);
std::cout<<b<<" times :"<<PickWord(a,b,c).max<<std::endl;
std::cout<<c<<" times :"<<PickWord(a,b,c).sec<<std::endl;
free(b);
free(c);
}
华为:统计一串字符串中出现次数最多和次多的单词(华为上机考试题)
最新推荐文章于 2022-07-28 13:00:42 发布