Coding Change World

代码改变世界
PKU 1002解题总结

  闲来无事,研究了一下PKU1002的题目,大意就是把含有字母的电话号码,转换为数字,然后再计算每个电话号码出现的次数,输出。本来蛮简单的一道题,结果折腾了好久,主要也是自己的水平太菜了,先是直接用字符串来处理,结果也都对,但是提交就是出现runtime error,后来才发现,要输入10W个电话号码,字符串光分配空间估计都够呛呀,也是自己审题不清,后来仔细阅读了了一下题目,也怪自己英文太挫了,在网上借鉴了一下思路,因为题目限制最大7位完全可以用整数来存储,然后保存之后,考虑要计算重复次数,结果楼主想出了特NC的一个算法,就是再开辟一个10W的整形数组,然后,对第一个冒泡进行排序,把出现次数大于2的全都转移到数组2中,然后再对2进行冒泡排序输出,由于要记录数组1和数组2的次数,相当于要开辟40W的空间,结果直接默认栈都被我整溢出了,后来又只好借鉴前辈高手的思路,也怪自己太笨了,真是算法写的挫,累死计算机啊,然后采用了,先转换数字,然后直接进行冒泡排序,修改了一番,没有错误了,结果timelimited。。。。。又去参考别人的思路去了,原来要快速排序,冒泡的时间效率是O2,快排是O,但是快排的算法感觉蛮难写的,而且还有递归,幸好stdlib中有现成的,就抄了一个过来,还是自己水平太差了,结果抄的不对,尼玛,参数也传错,结果快排等于没排,由于自己手工输的不需要快排,结果还老对,纠结了1天,无果,一直WA,快WA出翔了,第二天,用sample数据测试发现了快排的问题。qsort(a,num,sizeof(int),cmp) ,第一个参数是数组,第二个是数组的元素,第三个是一个步长,因为比较的是int,cmp是一个自己实现的函数,格式如下

int cmp(const void*a,const void*b)//快排自定义cmp 
{
    return *(int*)a-*(int*)b;
}

结果将参数修改了一下,直接就AC了,心情大好,总结一下,自己的错误蛮多的,不仔细,想当然,哎,说多了都是泪呀,把代码贴出来好了:

// 1002.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "string.h"
#include "stdlib.h"
#include "stdio.h"


int AtoNum(char* temp)
{
	int carry=1;
	int result=0;
	int count=0;
	int n=0;
	for (int i=strlen(temp)-1;i>=0;i--)
	{
		switch(temp[i])
		{
		case '0':
			n=0;
			break;
		case '1':
			n=1;
			break;
		case 'A':
		case 'B':
		case 'C':
		case '2':
			n= 2;
			break;
		case 'D':
		case 'E':
		case 'F':
		case '3':
			n= 3;
			break;
		case 'G':
		case 'H':
		case 'I':
		case '4':
			n= 4;
			break;
		case 'J':
		case 'K':
		case 'L':
		case '5':
			n= 5;
			break;
		case 'M':
		case 'N':
		case 'O':
		case '6':
			n= 6;
			break;
		case 'P':
		case 'R':
		case 'S':
		case '7':
			n= 7;
			break;
		case 'T':
		case 'U':
		case 'V':
		case '8':
			n= 8;
			break;
		case 'W':
		case 'X':
		case 'Y':
		case '9':
			n= 9;
			break;
		}
		if (temp[i]!='-')
		{
			count++;
			if(count>7)
				return result;
			result+=n*carry;
			carry=carry*10;	
		}
	}
	return result;
}
int cmp(const void*a,const void*b)//快排自定义cmp 
{
	return *(int*)a-*(int*)b;
}
int main(int argc, char* argv[])
{
	int a[200000];
	char input[256];

	int num;
	scanf("%d",&num);
	for (int i=0 ;i<num;i++)
	{
		scanf("%s",input);
		a[i]=AtoNum(input);//转换为数字
	}
	if (num==1)
	{
		printf("No duplicates.\n");
		return 0;
	}
	qsort(a,num,sizeof(int),cmp);
	int mark=0; //是否出现重复的
	int times=1;
	for (int i=0;i<num;i++)
	{
		if(a[i]==a[i+1])
		{
			mark=1;
			times++;
		}else
		{
			if(times>1)
				printf("%03i-%04i %d\n",a[i]/10000,a[i]%10000,times);
			times=1;
		}
	}
	if (mark==0)
	{
		printf("No duplicates.\n");
	}
	return 0;
}

 

posted on 2013-12-17 09:33  alphaxz  阅读(349)  评论(0编辑  收藏  举报