现需要统计若干段文字(英文)中的不同单词数量。
如果不同的单词数量不超过10个,则将所有单词输出(按字母顺序),否则输出前10个单词。
注1:单词之间以空格(1个或多个空格)为间隔。
注2:忽略空行或者空格行。
注3:单词大小写敏感,即'word'与'WORD'是两个不同的单词 。
输入说明
若干行英文,最后以!!!!!
为结束。
输出说明
不同单词数量。
然后输出前10个单词(按字母顺序),如果所有单词不超过10个,则将所有的单词输出。
输入样例
Failure is probably the fortification in your pole
It is like a peek your wallet as the thief when you
are thinking how to spend several hard-won lepta
when you Are wondering whether new money it has laid
background Because of you, then at the heart of the
most lax alert and most low awareness and left it
godsend failed
!!!!!
输出样例
49
Are
Because
Failure
It
a
alert
and
are
as
at
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路:这道题呢大概分有几块,输入,计数,排序,去重,输出.
输入可以用一个字符串数组,一次输入一个单词然后存到数组里
计数的话用双重循环遍历整个数组,用各个单词分别和其他所有单词compare,结果不等于0即为不相等,计数加一
排序也只用到两个函数,compare和swap,s1.compare(s2),如果s1在字典中的顺序先于s2返回负值,反之,如果s2>s1返回正值,所以如果为正值的话就交换s1和s2,即可做到排序的效果
去重,排过序之后,只要依次判断下一个单词是否与当前的单词相同,相同就去掉,以此类推
输出题目要求的单词
输出和去重其实是一块进行的,用双重循环遍历整个数组,和计数时用到的一样,对结果为0的进行标记,输出结果不为0的且满足题目要求的单词
参照代码,更好理解
#include<bits/stdc++.h>
using namespace std;
string a[2000];
int main()
{
string s;
int i=0;
cin>>s;
while(s.compare("!!!!!")!=0)
{
a[i++]=s;
cin>>s;
}
int sign;//标记符
int cnt=0;
for(int j=0;j<i;j++)
{
sign=1;
for(int k=j+1;k<i;k++)
{
if(a[j].compare(a[k])==0)//相等记为0
sign=0;
}
if(sign)//计数记为1(即不满足相等条件)的单词
cnt++;
}
cout<<cnt<<'\n';
for(int j=0;j<i;j++)
{
for(int k=j+1;k<i;k++)
{
if(a[j].compare(a[k])>0)//a[k]>a[j]的时候,返回正值
{
a[j].swap(a[k]); //交换
}
}
}
if(cnt>10)
for(int j=0,yes=0;yes<10;j++)
{
sign=1;
for(int k=j-1;k<j&&k>=0;k++)
if(a[j].compare(a[k])==0)
sign=0;
if(sign)
{
cout<<a[j];
cout<<'\n';
yes++;
}
}
else
for(int j=0;j<i;j++)
{
sign=1;
for(int k=j-1;k<j&&k>=0;k++)
if(a[j].compare(a[k])==0)
sign=0;
if(sign)
{
cout<<a[j];
cout<<'\n';
}
}
return 0;
}