C++输出出现次数最多的三个单词,问题求教

单词的定义就是一个句子中被逗号,空格等分割符分割的完整字母串。现有若干行句子作为输入(出现空行,表示文章结束)请输出重复次数最多三个单词。如果重复次数一样,那就按照第一次出现的先后顺序来输出。(我们假定文章不会出现数字,单词中不包含字符,即不会出现 I'm 的情况 )#include<stdio.h>#include<string.h>int main(){ int i,j,k; char s[100]; while(strcmp(s,"")!=0) { gets(s); for(i=0;i<100;i++) if(a[i]=='.') a[i]=' ';然后下一步存储单词然后统计次数就不会了。。。求教大神

给你一个思路(这题其实非常简单),拿一个map(如果不知道这是什么可以去查)储存所有单词到其次数的键值对。(当然如果你会用unordered_map就更好了),从而达到统计目的,分析如下:
你的主要问题有:
- 能想到的办法会爆内存
- 数组遍历的时间太慢无法承受
- 不知道如何把字符串作为键
map的使用:
- 解决了将字符串作为键的问题
- 二叉查找树(典型地实现是红黑树)或哈希表提供快速查找和对比方案
- 方便地,可读性高的操作追问

您让一个刚学两个月的新手用这个。。。
我查了但是map的单个储存和统计次数并看不懂。。。【最后三行听都没听说过】

追答

对你我而言都很糟糕的是我一开始并不知道您是新手,再者,我也不认为map是很难的东西。当然我也觉得我已经回答完您的问题了。当然,友好起见,我也讲讲一种新手友好的办法。其实我对这个问题的处理办法有很多种,这只是其中一个中等难度的。如果你要更简单的方法的话,你可以选择开一个足够大的字符串数组和等大的整数数组,每次碰到单词就遍历数组,若没有找到,在末尾添加一个字符串,若找到,在对应的下标的整数修改。重复以上过程,最后排序。但是事实上对于你而言这样的方法是简单了,但写这一段代码的难度可能不是你能完成的,而且这种做法从时间,空间和代码长度上都与map法不可同日而语。当然了,更好的办法是使用Trie甚至是Aho-Corasick automachine,但他们的难度应该不是您能接受的,所以总而言之,我仍然推荐map。还有并不是冒犯的说,学两个月以后掌握map的使用应当不是难事,所以作为题外话,您可以试试改变一下您的学习方法,可能会有意想不到的效果。

温馨提示:内容为网友见解,仅供参考
无其他回答

C++输出出现次数最多的三个单词,问题求教
给你一个思路(这题其实非常简单),拿一个map(如果不知道这是什么可以去查)储存所有单词到其次数的键值对。(当然如果你会用unordered_map就更好了),从而达到统计目的,分析如下:你的主要问题有:- 能想到的办法会爆内存 - 数组遍历的时间太慢无法承受 - 不知道如何把字符串作为键 map的使用:- 解决...

请问在C++中输入系列单词,如何统计出现次数最多的那个单词?跪求啊!!
if(sen[i]==' ' || sen[i]='\\0'){word[j][k-1]='\\0';j++;k=0;}}\/\/分配空间存放每个单词出现的伪次数 cnt=(int*)calloc(j-1,sizeof(int));\/\/计算每个单词出现的伪次数 for(i=0;i<j;i++){for(k=0;k<j;k++){if(strcmp(word[i],word[k])==0){cnt[n]++;}}n...

请问在C++中输入系列单词,如何统计出现次数最多的那个单词?跪求啊!!
cnt=(int*)calloc(j-1,sizeof(int));\/\/计算每个单词出现的伪次数 for(i=0;i<j;i++){ for(k=0;k<j;k++){ if(strcmp(word[i],word[k])==0){ cnt[n]++;} } n++;} max=cnt[0];\/\/查找出现最多的 for(i=1;i<n;i++){ if(cnt[i]>max){ max=cnt[i];} } \/\/输...

C语言统计一篇文件里出现最多的三个单词
pw=strtok(pl,s); \/\/提前字符串pl中的首个单词 while(pw!=0){ q=Find(head, pw, &f);if(f==1){ \/\/找到该单词,出现次数加一 q->c++;}else{ \/\/没找到该单词,将该单词插入链表 if(q==head && q->w[0]=='\\0'){ \/\/原链表为空,这是第一个单词 strcpy(q->w, pw);q->...

C++统计出现次数最多的字母和次数
{ int a[26]=0;char c;istream fin("d.txt",ios::in);while(!!fin.eof()){ fin>>c;if('A'<=c&&c<='Z') c+=32; \/\/把大写装换成小写,如果区分大小写的话,按下面的方法一样,只是数组大小改成52就好了.if('a'<=c&&c<='z') a[c-'a']++;} for(int k=0,i=0...

C++怎么寻找一个字符串里连续出现次数最多的字符连续出现的个数?
printf("请输入字符串:\\n");gets(s);len=strlen(s);for(i=0;i<len;i++){ sum[s[i]-97]++;} max=0;for(i=0;i<26;i++){ if(sum[i]>sum[max]){ max=i;} } printf("出现最多的是: %c\\n 出现次数是: %d\\n",(max+97),sum[max]);system("pause");return 0;} ...

c++算法,关于出现频率最大的数的问题
1、将原字符串数组排序(让同一字符串排在一起)2、设置一个变量用于存放当前最大值 3、遍历一次数组,记录同个字符串出现的次数,当次数大于最大值时,更新最大值 a[n];对a[n]进行排序;int max=0;int num=1;string b=a[0];for(int i=1;i<n;i++){ if(b!=a[i]){ if(max<num...

C++输入n个数,把出现次数最多的那个数找出来,要简单易懂
v[t]++; } for(MAPINT::iterator ip=v.begin();ip!=v.end();ip++) { if(ip->second>max) { max=ip->second; t=ip->first; } } cout<<"频率最高的元素是:"<<t; return 0;}

c++ 输入n个数 找出现次数最多的那个数
根据所输入的范围n建立一个一维数组a[n],n不能是变量.必须是常量或者常数.先由规定的范围建立一个数组.然后输入了x数字就对应a[x]=a[x]+1,输入完毕后,然遍历整个数组找到最多的就行了.并不难的.

C++ 输入N个数 找出出现次数最多的
int*a=new int[N];\/\/统计20个数种出现次数最多的数 int*b=new int[N];int *c=new int[N];memset(b,0,N);memset(c,0,N);cout <<"输入"<<N<<"个整数\\n";for(int i=0;i<N;i++){ cin>>a[i];} for(int i=0;i<N-1;i++){\/\/对a中的元素进行排序 for(int j=0;...

相似回答