您的位置:首页 > 其它

UVa:755 - 487--3279

2014-06-03 11:30 375 查看
题意:找出有重复的电话号码,输出这些号码的标准形式和出现的次数。

当电话号码不足7位时,用‘0’补位。

刚开始以为用边输入边比较,最后排序输出是最高效的算法,但一直Time limit exceeded,“山外青山楼外楼”,网友们的算法更是巧妙和高效啊,涨姿势了。

发现一点:用sort函数无法对二维字符数组进行排序,只能将二维数组转换成结构体数组,再对结构体数组进行排序。

Code:

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<algorithm>
using namespace std;
struct DS{
    char pn[300];
};
DS ds[100010];

char mapn[30]="22233344455566670778889990",s[300];

bool cmp(DS a,DS b)
{
    return strcmp(a.pn,b.pn)<0;
}

int main()
{
    int N;
    scanf("%d",&N);

    while(N--){
        int n;
        scanf("%d",&n);
        getchar();

        for(int i=0;i<n;i++){
            int t=0;
            char ch;
            memset(s,0,sizeof(s));
            while(ch=getchar()){
                if(ch!='\n'){
                    if(isalpha(ch)){
                        int e=ch-'A';
                        s[t++]=mapn[e];
                    }
                    if(isdigit(ch))
                        s[t++]=ch;
                }
                else
                    break;
            }
            if(t<7){
                for(int j=t;j<7;j++)
                    s[j]='0';
            }
            s[7]='\0';
            strcpy(ds[i].pn,s);
        }
        sort(ds,ds+n,cmp);

        int num=0,p=0,j=0;
        for(int i=0;i<n;i++){
            if(strcmp(ds[j].pn,ds[i].pn)==0)
                num++;
            else{
                if(num>1){
                    p=1;
                    for(int k=0;k<7;k++){
                        printf("%c",ds[j].pn[k]);
                        if(k==2)
                            printf("-");
                    }
                    printf(" %d\n",num);
                }
                j=i;
                num=1;
            }
            if(i==n-1&&num>1){
                p=1;
                for(int k=0;k<7;k++){
                    printf("%c",ds[j].pn[k]);
                    if(k==2)
                        printf("-");
                }
                printf(" %d\n",num);
            }
        }
        if(!p)
            printf("No duplicates.\n");

        if(N) printf("\n");
    }
    return 0;
}


--------------------------------------------------------------------------------------------

Keep It Simple,Stupid!

--------------------------------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: