2005年百度之星程序设计大赛试题初赛题目 第四题(共四题 100 分):低频词过滤( 40 分)

毫无疑问,C/C++是很重要的,虽然以前自学过一点,但是基本没有多少用处。唯一的就是还勉强能够看懂别人的程序,要自己写的话就不行了。C#作为他们新的继承者也是很重要的吧,都以其看一下吧。
当然,这次弄的程序主要还是算法之类的吧,这是Baidu的百度之星大赛第一年的初赛题目。因为我没有研究过STL之类的东西,所以也想不到使用map、vector这些东西,就想到用C来做,但是这样的代价很高的啊,还容易出问题,有的地方还想不出来。真的要好好学习一下啊!
以下是题目及源程序,已经验证正确。
但是请注意,该程序转自 http://hi.baidu.com/xun1573/blog/item/912898f26a74e216b07ec5b3.html

/*
// 百度之星程序设计大赛试题及答案
请编写程序,从包含大量单词的文本中删除出现次数最少的单词。如果有多个单词都出现最少的次数,则将这些单词都删除。

输入数据:程序读入已被命名为corpus.txt的一个大数据量的文本文件,该文件包含英文单词和中文单词,词与词之间以一个或多个whitespace分隔。(为便于调试,您可下载测试corpus.txt文件,实际运行时我们会使用不同内容的输入文件。)

输出数据:在标准输出上打印删除了corpus.txt中出现次数最少的单词之后的文本(词与词保持原来的顺序,仍以空格分隔)。 评分标准:程序输出结果必须正确,内存使用越少越好,程序的执行时间越快越好。
*/

#include
< iostream >
#include
< fstream >
#include
< map >
#include
< vector >
#include
< string >
#include
< cstring >
#include
< cstdlib >
#include
< iterator >
#include
< algorithm >
#include
< cctype >
using namespace std;

typedef map
< string, int > ::iterator mit;
typedef string::size_type sit;

int  main()
{
    map
<string,int> words_count;
    vector
<string> sve;
    string word;
    string s
=",!?.:"" ;'";
    ifstream fin(
"E:/corpus.txt");
    
if(!fin)
    
{
        cerr
<<"unable to open file"<<endl;
        exit(
0);
    }

    
//读取并统计单词单词
    while(fin>>word)
    
{
        sit iter
=word.find_first_of(s);
        
if(iter!=string::npos)
            word
=word.substr(0,iter-0); //处理标点符号
        string temp(strlwr(const_cast<char*>(word.c_str())));
        word
=temp;
        sve.push_back(word);
        
++words_count[word];
    }

    fin.close();

    
//删除个数最少的单词
    mit i=words_count.begin();
    
int n=i->second;
    
for(;i!=words_count.end();++i)
        
if(i->second<n) n=i->second;
    
for(mit i=words_count.begin();i!=words_count.end(); )
    
{
        
if(i->second==n)
        
{
            sve.erase(remove(sve.begin(),sve.end(),i
->first),sve.end());
            
++i;
        }

        
else ++i;
    }

    
//输出到屏幕
    copy(sve.begin(),sve.end(),ostream_iterator<string>(cout," "));
    cout
<<endl;

    system(
"pause");
    
return 0;
}

当然不仅是map这些,及时是string里边的函数我也不知道这样来用,根本就不知道这些方法。如果都使用C的char*岂不是累死了。呵呵,学无止境啊

你可能感兴趣的:(2005年百度之星程序设计大赛试题初赛题目 第四题(共四题 100 分):低频词过滤( 40 分))