华为:统计一串字符串中出现次数最多和次多的单词(华为上机考试题)

//增加难度,并返回最大值和次大值得个数
#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);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值