UVA 10815 Andy's First Dictionary

题目意思比较简单,就是输入一些句子,将句子中的单词全部转化成小写字母,然后找出其中的单词并且按照字典序输出。

一看到这个题目,我就想到,用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的指针是一个常量。也只能先这样了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值