题目意思比较简单,就是输入一些句子,将句子中的单词全部转化成小写字母,然后找出其中的单词并且按照字典序输出。
一看到这个题目,我就想到,用STL里面的map啊!然后就用了。。第一次交WA了。百思不得其解。。。实在想不出来到底什么地方错了,到网上找题解,发现都是用qsort来写的,找了半天也没找到一个map的。然后我没办法了,回去看,然后发现自己的输出里面第一个竟然是空格!!!我以为是输入原因,刚开始没在意。然后找了别人的代码,一验证果然是应该没有空格的!于是我尝试输入两个空格,发现果然有问题。= =,然后就改动了一下。果然,自己刚开始没考虑周全,连样例都没过。。。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<ctype.h>
#include<map>
using namespace std;
char str[202],s[202];
map<string,int>mp;
int main()
{
mp.clear();
int i,j,k,l,t,index=0;
while(gets(str))
{
j=0;
l=strlen(str);
for(i=0;i<=l;i++)
{
if(isalpha(str[i]))s[j++]=str[i];
else if(j>0){ //刚开始没加j>0这个条件,导致如果出现连续的空格或者非字母的字符,就会出现非字母的字符串到map中去。
s[j]='\0';
for(k=0;k<j;k++)
{
if(s[k]>='A'&&s[k]<='Z')s[k]=s[k]+32;
}
if(!mp[s]){mp[s]=index++; //其实我刚开始把j>0放在这里,发现不能解决问题。也不是很清楚什么原因。
}
j=0;
}
}
}
// printf("%d\n",index);
map<string,int>::iterator it;
for(it=mp.begin();it!=mp.end();it++)
cout<<it->first<<endl;
return 0;
}
其实呢,我看了一大堆qsort的结题报告以后,发现了一个用set解的结题报告。然后就去了解了一下Set(其实以前学过,没用过所以忘记了= = )。
set是一个集合,可以插入多个元素,并且把重复元素筛选掉,同时可以进行排序。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<ctype.h>
#include<set>
using namespace std;
char str[202],s[202];
set<string>st;
int main()
{
st.clear();
int i,j,k,l,t,index=0;
while(gets(str))
{
j=0;
l=strlen(str);
for(i=0;i<=l;i++)
{
if(isalpha(str[i]))s[j++]=str[i];
else if(j>0){
s[j]='\0';
for(k=0;k<j;k++)
{
if(s[k]>='A'&&s[k]<='Z')s[k]=s[k]+32;
}
st.insert(s);
j=0;
}
}
}
// printf("%d\n",index);
set<string>::iterator it;
for(it=st.begin();it!=st.end();it++)
cout<<*it<<endl;
return 0;
}
前面用了STL的容器,后面还是用qsort试了下。我记得好像以前是做过几道qsort的题目,只记得qsort功能十分强大!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
char str[210],s[100010][201];
int cmp(const void* _a,const void* _b)
{
char* a=(char*)_a;
char* b=(char*)_b;
return strcmp(a,b);
}
int main()
{
int i,j=0,k=0,l;
while(gets(str))
{
l=strlen(str);
for(i=0;i<=l;i++)
{
if(isalpha(str[i]))s[j][k++]=tolower(str[i]);
else if(k>0){
s[j][k]='\0';
j++;
k=0;
}
}
}
qsort(s,j,sizeof(s[0]),cmp);
printf("%s\n",s[0]);
for(i=1;i<j;i++)
if(strcmp(s[i],s[i-1])==0)continue;
else
printf("%s\n",s[i]);
}
其中qsort里面的cmp函数是精华。
int cmp(const void* _a,const void* _b)
{
char* a=(char*)_a; //强制转换类型
char* b=(char*)_b;
return strcmp(a,b);
}
其实我并不是很清楚这里const的用法,只知道这里的意思是定义了_a的指针是一个常量。也只能先这样了。