[原创]百度之星--低频词过滤题解
第四题(共四题 100 分):低频词过滤( 40 分)
题目描述:请编写程序,从包含大量单词的文本中删除出现次数最少的单词。如果有多 个单词都出现最少的次数,则将这些单词都删除。
输入数据:程序读入已被命名为 corpus.txt 的一个大数据量的文本文件,该文件包含英 文单词和中文单词,词与词之间以一个或多个
whitespace 分隔。(为便于调试,您可下载 测试 corpus.txt 文件,实际运行时我们会使用不同内容的输入文件。)
输出数据:在标准输出上打印删除了 corpus.txt 中出现次数最少的单词之后的文本( 词与词保持原来的顺序,仍以空格分隔)。
评分标准:程序输出结果必须正确,内存使用越少越好,程序的执行时间越快越好。
不知有什么更好的解法没,我只知道下面的方法。
#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <map>
using namespace std;
int main(int argc, char* argv[])
{
int i;
map<string,int> wordrecord;
string delstr[30];
string a;
ifstream in("corpus.txt");
while(in>>a)
{
++wordrecord[a];
}
int mintimes=wordrecord.begin()->second;
int minnums = 0;
map<string,int>::iterator mapit = wordrecord.begin();
//统计出现次数最小的字符串
while(mapit!=wordrecord.end())
{
if((*mapit).second<mintimes)
{
minnums = 1;
delstr[0] = (*mapit).first;
mintimes = (*mapit).second;
}
else if((*mapit).second==mintimes)
{
delstr[minnums] = (*mapit).first;
minnums++;
}
++mapit;
}
in.close();
in.clear();
in.open("corpus.txt");
if(!in)
cout<<"error open!"<<endl;
//输出未删除的字符串
while(in>>a)
{
bool erase = false;
for(i=0;i<minnums;i++)
{
if(a==delstr[i])
{
erase = true;
break;
}
}
if(!erase)
cout<<a<<" ";
}
cout<<endl;
in.close();
in.clear();
return 0;
}