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

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

你可能感兴趣的:(cc++,笔试面试)