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

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;
}





你可能感兴趣的:(POJ-1002 487-3279——字符的映射和串匹配问题)