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

来源:互联网 发布:淘宝宝贝图片拍摄要求 编辑:程序博客网 时间:2024/06/05 12:00
//增加难度,并返回最大值和次大值得个数#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;elsereturn 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';//将最多的单词的统计个数置0for (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);}

原创粉丝点击