注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

奕克

爱家人爱工作爱生活

 
 
 

日志

 
 

HDU2072错误与正确解法对比  

2013-11-26 18:38:41|  分类: ACM |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
      应该算是一道简单的字符串处理题,先看网上找到的一种错误解法:
#include <stdio.h>
#include <string.h>
#define Max 10001

int main()
{   char str[Max];
    char res[10000][100];
    int i,len,j;
    char s[200];
    int pos;
    while (gets(str))
    {
        if(str[0]=='#')  break;
        len=strlen(str);
        pos=0;
        i=0;
        while(pos<len)
        {
            sscanf(str+pos,"%s",s);
            for (j=0;j<i;j++)
            {
                if(strcmp(res[j],s)==0)
                    break;
            }
            if (j==i)
                strcpy(res[i++],s);
            pos+=strlen(s)+1;
        }
        printf("%d\n",i);
    }
    return 0;
}

这个解法本地测试例子没问题,在线提交时却WA,究其原因,是 pos+=strlen(s)+1;这句代码只考虑了空格是1个来分隔每个单词的情况,如果单词之间是多个空格的,该代码就会出错。我在他基础上改了一下,AC了,代码效率一般,也懒得多想了,注意句子前后都可能是空格的情况。下面是我的改写:

#include <stdio.h>
#include <string.h>
#define Max 10001

int main()
{   char str[Max];
    char res[10000][100];
    int i,len,j;
    char s[200];
    int pos,k;
    while (gets(str))
    {   if(str[0]=='#')  break;
        len=strlen(str);
        pos=0;
        i=0;
        while(pos<len)
        {   k=0;
            while (str[pos]==' ') pos++;
            while (str[pos]!=' ' && str[pos]!='\0') s[k++]=str[pos++];
            if (k==0) break;
            s[k]='\0';
            for (j=0;j<i;j++)
            {
                if(strcmp(res[j],s)==0)
                    break;
            }
            if (j==i) strcpy(res[i++],s);
       }
        printf("%d\n",i);
    }
    return 0;
}
  评论这张
 
阅读(100)| 评论(3)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017