1002 487-3279

来源:互联网 发布:logo图标设计软件 编辑:程序博客网 时间:2024/05/12 19:53
几度崩溃~~
字符输入输出转换部分还是比较好弄的,关键排序比较麻烦。一开始用带后继的单向链表存放结点,电话号码存在结点的字符串里,因为是链表,就用上了直接插入排序,好容易调试完能出正确结果了,一提交,居然超时。。。看来测试数据那是相当bug。。
于是开始考虑效率问题,把转换好的电话号码作为数字存放在结点中,省去耗时的字符串比较,又弄了个指针数组存放结点地址,对指针数组进行快速排序。。。
程序改了又改,提交了几次都WA,有次调试还出现蓝屏,ft!绞尽脑汁,终于能出正确结果了,一submit还是TLE,再度崩溃。。。
看了看disguss,有牛人做到200ms以下的,据说用HashMap做的,还有用二叉排序树做的,快排好象也可以,不过我的代码不行,也不想再改了,看他们的代码去~~
感觉用C做题好累啊,自己写的函数又长,效率又差!吃力不讨好,还是羡慕C++功能强大的STL,以后得学C++了。
虽然没有AC,还是贴出TLE的代码留作纪念:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define LEN sizeof(struct results)
struct results
{
unsigned long num; /* num:转换后的电话出现的次数,s:转换后的电话号码(7位)*/
unsigned long s;
};
struct results *p[100001]; /* 指针数组p存放结点地址*/
unsigned long numbers=0; /* 已输入的号码数*/
void QuickSort(unsigned long low,unsigned long high);
unsigned long partition(unsigned long low,unsigned long high);
struct results *creatNode(unsigned long input); /* 创建新结点*/
void main()
{
unsigned long totalinput,input,tail,duplicates=0,i,k;
int j;
char in[20]; /* 存放输入的一行字符号码*/
scanf("%ld",&totalinput); /*输入的号码总量*/
while(totalinput--)
{
for(j=0;j<16;j++)
in[j]='/0';
input=0;
scanf("%s",in);
for(i=j=0;i<7;j++) /* 处理输入的字符串,转换为数字input*/
{
if(in[j]>='0'&&in[j]<='9')
{
input=input*10+in[j]-48;
i++;
}
else if(in[j]>='A'&&in[j]<='Z')
{
if(in[j]>='A'&&in[j]<='O')
input=(in[j]-'A')/3+2+input*10;
else if(in[j]>='T'&&in[j]<='Y')
input=(in[j]-'B')/3+2+input*10;
else input=7+input*10;
i++;
}
}
p[++numbers]=creatNode(input); /*为新增号码创建新结点*/
}
QuickSort(1,numbers); /* 根据结点中的电话号码值对指针数组快速排序*/
for(i=tail=1;i<=numbers;) /* 输出出现不止一次的电话号码及其出现次数*/
{
k=p->s;
while((++tail<=numbers)&&p[tail]->s==k)
{
p->num++;
}
if(tail>(i+1))
{
for(j=6;j>=0;j--) /* 对s从高位到低位依次输出各位数字,既所要求格式的电话号码*/
{
if(j!=3)
printf("%d",k/(int)pow(10,j));
else
printf("-%d",k/(int)pow(10,j));
k=k%(int)pow(10,j);
}
printf(" %d/n",p->num);
duplicates++;
}
i=tail;
}
if(!duplicates)
printf("No duplicates.");
}
void QuickSort(unsigned long low,unsigned long high)
{
unsigned long pivotloc;
if(low<high)
{
pivotloc=partition(low,high);
QuickSort(low,pivotloc-1);
QuickSort(pivotloc+1,high);
}
}
unsigned long partition(unsigned long low,unsigned long high) /*对low和high之间的数据排序*/
{
unsigned long pivotkey; /*pivokey为枢轴*/
p[0]=p[low];
pivotkey=p[low]->s;
while(low<high)
{
while(low<high&&p[high]->s>=pivotkey)
--high;
p[low]=p[high];
while(low<high&&p[low]->s<=pivotkey)
++low;
p[high]=p[low];
}
p[low]=p[0];
return low;
}
struct results *creatNode(unsigned long input) /*创建新结点*/
{
struct results *newNode;
newNode=(struct results *)malloc(LEN); /*为新结点分配内存空间,并初始化*/
newNode->num=1;
newNode->s=input;
return newNode;
}