[原创]百度之星--低频词过滤题解

[原创]百度之星--低频词过滤题解
第四题(共四题 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;
}

posted on 2009-05-14 23:21  absolute  阅读(436)  评论(0编辑  收藏  举报

导航