华为:统计一串字符串中出现次数最多和次多的单词(华为上机考试题)
来源:互联网 发布:淘宝宝贝图片拍摄要求 编辑:程序博客网 时间: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);}