U1002:487-3279

来源:互联网 发布:远程网络学历教育 编辑:程序博客网 时间:2024/06/05 18:18

其实这个题目比较简单。唯一比较恶心的就是,输入字符串竟然长度为16还不够。应该来说不会无谓的输入'-'的么。输入长度扩展到80就OK了

不过这个代码数据量上升,对于一些操作性能上体验还是比较明显。

比如hash得一个memset就是用了60ms, qsort和使用原生的qsort就差距了60ms,取消hash索引还可以降低到150ms

#include <stdio.h>#include <memory.h>#include <stdlib.h>#define INPUT_MAX100000#define TELNUM_NUM10000000int g_InputNum = 0;int g_Input[INPUT_MAX];// 保存不重复的输入。减少hash遍历int g_iHash[TELNUM_NUM];// hash所有电话号的重复次数// 相对使用switch case没有明显性能提升char g_TelChar2UChar[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1// 47, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9// 48 - 57, -1, -1// 58 - 59, -1, -1, -1, -1, -1// 64, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, -1, 7, 7, 8, 8, 8, 9, 9, 9, -1// 65 - 90, -1, -1, -1, -1, -1, -1, -1, -1, -1// 91 - 99, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};inline int TelString2Int(char* pStr){int ret = 0;for (int i = 0; i < 7; pStr++){char tempC = g_TelChar2UChar[*pStr];if(tempC != -1){ret = ret * 10 + tempC;i++;}}return ret;}// 快速排序// 比使用系统提供的qsort性能提高了60ms左右。// 可能是系统的qsort都是内存copy和函数调用导致void qsort(int* pArray, int indexB, int Num){// 组织前后int begin = 1;int end = Num - 1;int temp;if (Num < 2){return;}for (begin ; begin < end; begin++){if(pArray[indexB] < pArray[indexB+begin]){for ( ; end > begin; end--){if(pArray[indexB+end] < pArray[indexB]){// 交换temp = pArray[indexB+end];pArray[indexB+end] = pArray[indexB+begin];pArray[indexB+begin] = temp;break;}}}if(begin >= end){break;}}if(pArray[indexB+begin] > pArray[indexB]){begin--;}temp = pArray[indexB+begin];pArray[indexB+begin] = pArray[indexB];pArray[indexB] = temp;if(begin > 1){qsort(pArray, indexB, begin);}if(Num - begin - 1 > 1){qsort(pArray, indexB+begin+1, Num - begin - 1);}}int main(){int n = 0;if (scanf("%d", &n) != EOF){g_InputNum = 0;//memset(g_iHash, 0, sizeof(g_iHash));// 这个函数消耗60msfor (int i = 0; i < n; i++){char strTel[80];// 电话号码最长7,间隔符+结束符int  iTel;scanf("%s", strTel);iTel = TelString2Int(strTel);g_iHash[iTel]++;if(g_iHash[iTel] == 2){// 刚刚开始重复的电话g_Input[g_InputNum++] = iTel;}}if (g_InputNum < 1){printf("No duplicates.\n");}else{// 只对重复得号码入进行一次快速排序qsort(g_Input, 0, g_InputNum);             //快速排序char outputTemp[2048];int  outputLen = 0;for(int i = 0; i < g_InputNum; i++){int len = sprintf(outputTemp+outputLen, "%03d-%04d %d\n", g_Input[i]/10000, g_Input[i]%10000, g_iHash[g_Input[i]]);outputLen += len;if(outputLen + 10 > 2048){printf(outputTemp);outputLen = 0;}}if (outputLen > 0){printf(outputTemp);outputLen = 0;}}}return 0;}


原创粉丝点击