The Fourth Dimension Space

枯叶北风寒,忽然年以残,念往昔,语默心酸。二十光阴无一物,韶光贱,寐难安; 不畏形影单,道途阻且慢,哪曲折,如渡飞湍。斩浪劈波酬壮志,同把酒,共言欢! -如梦令

POJ-1002 487-3279——字符的映射和串匹配问题

题目大意:这道题是中文的,题意就略了吧;
我的思路是:先把字符串里面的-过滤掉,然后再用转换函数,将字符映射到响应的数字,然后排序,记录,输出结果;
开始我本来打算用map容器来做这个题的,可是discuss里面说这个方法容易超时,所以最后还是选用了if语句,虽然长一点但是保证效率,呵呵;

心得嘛,我发现百度上写的那篇关于sscanf用法的文章有误,我在这里给它修正一下,那里提到过周星星同学的用法,里面说用sscanf可以过滤的字符串中的指定内容,其实并非如此;百度原文如下:

“4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串
         sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
           printf("%s\n", buf);
         结果为:123456abcdedf ”

实际上,如果你把大写字母插入到数字和小写字母之间时,buf只能够取到大写字母前面部分的内容;
如sscanf("12345BCDEFabcdedf", "%[1-9a-z]", buf);
在输出buf的值,出来后应该是12345;

#include <algorithm>
#include 
<cstdio>
#include 
<cmath>
#include 
<map>
#include 
<iostream>
#include
<cstring>
using namespace std;

struct node 
{

    
int data;
    
int num;
}
;






int phonenum[100001];
node record[
100001];
char oritemp[200];
char midtemp[200];
char destemp[200];

void collect(char a[])
{
    
int len=strlen(a);
    
int pos=0;
    
int i;
    
for(i=0;i<len;i++)
    
{
        
if(a[i]!='-')
        
{    
            midtemp[pos]
=a[i];
            pos
++;
        }

    }

    midtemp[pos]
='\0';
}





void convert(char a[])
{
    
int i;
    
for(i=0;i<7;i++)
    
{
        
if(a[i]=='A'||a[i]=='B'||a[i]=='C')
            destemp[i]
='2';
        
else if(a[i]=='D'||a[i]=='E'||a[i]=='F')
            destemp[i]
='3';
        
else if(a[i]=='G'||a[i]=='H'||a[i]=='I')
            destemp[i]
='4';
        
else if(a[i]=='J'||a[i]=='K'||a[i]=='L')
            destemp[i]
='5';
        
else if(a[i]=='M'||a[i]=='N'||a[i]=='O')
            destemp[i]
='6';
        
else if(a[i]=='P'||a[i]=='R'||a[i]=='S')
            destemp[i]
='7';
        
else if(a[i]=='T'||a[i]=='U'||a[i]=='V')
            destemp[i]
='8';
        
else if(a[i]=='W'||a[i]=='X'||a[i]=='Y')
            destemp[i]
='9';
        
else
            destemp[i]
=a[i];
    }

}





int main ()
{
    
int n;
    
int i,j;
    scanf(
"%d",&n);
    
for(i=1;i<=n;i++)
    
{

        scanf(
"%s",oritemp);
        collect(oritemp);
        convert(midtemp);
        sscanf(destemp,
"%d",&phonenum[i]);

    }

    sort(phonenum
+1,phonenum+1+n);
    
int flag=0;
    
int pos=0;
    
for(i=1;i<=n;i++)
    
{
        
if(i==1)
        
{
            pos
++;
            record[pos].data
=phonenum[i];
            record[pos].num
++;
        }


        
else if(phonenum[i]==phonenum[i-1])
        
{

            record[pos].num
++;
            flag
=1;
        }

        
else
        
{

            pos
++;
            record[pos].data
=phonenum[i];
            record[pos].num
++;
        }



    }


    
if(flag==0)
        printf(
"No duplicates. \n");
    
else if(flag==1)
        
for(i=1;i<=pos;i++)
        
{
            
if(record[i].num!=1)
            
{
                
char temp[200];
                sprintf(temp,
"%07d",record[i].data);
                
int j;
                
int flag=0;
                
for(j=0;j<strlen(temp);j++)
                
{
                    
if(j==3&&flag==0)
                    
{
                        printf(
"-");
                        flag
=1;
                    }

                    printf(
"%c",temp[j]);
                }

                printf(
" %d\n",record[i].num);
            }

        }

        
return 0;
}





posted on 2009-03-05 13:10 abilitytao 阅读(2232) 评论(6)  编辑 收藏 引用

评论

# re: POJ-1002 487-3279——字符的映射和串匹配问题 2009-03-05 13:14 陈梓瀚(vczh)

你最近迷上刘谦了不成?  回复  更多评论   

# re: POJ-1002 487-3279——字符的映射和串匹配问题 2009-03-05 15:07 成大才子

这道题我也做了,我感觉用数组映射效果会好些  回复  更多评论   

# re: POJ-1002 487-3279——字符的映射和串匹配问题[未登录] 2009-03-05 17:50 abilitytao

@陈梓瀚(vczh)
呵呵 他经常来我家这边演出呵 他的魔术也很棒丫  回复  更多评论   

# re: POJ-1002 487-3279——字符的映射和串匹配问题 2012-07-26 10:23 梁子

sort(phonenum+1,phonenum+1+n);这句是排序?  回复  更多评论   

# re: POJ-1002 487-3279——字符的映射和串匹配问题 2012-07-26 10:36 梁子

sprintf(temp,"%07d",record[i].data);还有这一句也不怎么懂  回复  更多评论   

# re: POJ-1002 487-3279——字符的映射和串匹配问题 2012-09-29 15:28 vvvvv

可不可以这样啊,char c>81的话,c--.c>64,int n=(c-65)/3+2,c>47,n=c-48,这样转换是不是更快呢?  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理