POJ 1002 修订版
总结了下我的代码,主要有三个地方可以改进:1.读入参数时的处理(我用的getline) 2.保存时做的处理(将其转化为整型)3.排序(自然排序) 总耗时 3686ms
1.读入参数时的处理
对于当时的cin入数值后的换行符不知道如何清空的问题,找到了解决办法,就是不用getline,继续cin。该处理对代码耗时没有什么贡献。
2.保存时做的处理
我的做法是直接将其变成整型数。
a. 将其存储为数字型字符串,然后用atol函数将其变成整型。感觉会快一点(少做一次乘法一次加法的操作),但是优化程度微弱。
3.排序
我的做法是自然排序,顺序比较。
a。存储为二叉树。速度快了一点点 不过不知为什么总是wrong answer. 注意:1.用new的时候,调用函数中定义的new不能在函数体外使用(会出不可预知的错误)。2.如果函数的入参是个空指针,即使在函数里面将这个指针指向另外一个地方,实际也没有赋值上。
法一:
View Code
1 #include <iostream> 2 #include <string> 3 #include<stdio.h> 4 #include<time.h> 5 #include<stdlib.h> 6 using namespace std; 7 8 class directory{ 9 public : 10 int tel ; 11 int number ; 12 directory *left; 13 directory *right; 14 directory(){ 15 tel = -1; 16 number = 0; 17 left = NULL; 18 right = NULL; 19 } 20 }; 21 22 int change(string letters); 23 void insert(directory *now,directory *tels); 24 int printd(directory *tels); 25 26 int main() 27 { 28 clock_t start,end; 29 double time; 30 start = clock(); 31 32 directory *first,*now; 33 int directoryNum,Num; 34 string letters; 35 36 cin>>directoryNum; 37 cin>>letters; 38 39 Num = change(letters); 40 41 first = new directory(); 42 first->tel = Num; 43 first->number = 1; 44 45 46 while (--directoryNum){ 47 cin>>letters; 48 49 Num = change(letters); 50 51 now = new directory(); 52 now->tel = Num; 53 now->number = 1; 54 55 insert(now,first); 56 57 } 58 59 if(!printd(first)){ 60 cout<<"No duplicates."<<endl; 61 } 62 63 end = clock(); 64 time = (double) end - start ; 65 cout<<"\n the time is : "<<time<<endl; 66 67 return 0; 68 } 69 70 int change(string letters){ 71 int num = 0,n = 0; 72 char c; 73 char cs[10]; 74 int i=0; 75 76 while (n!=letters.size()){ 77 c = letters[n]; 78 if (isdigit(c)){ 79 cs[i] = c; 80 n++;i++; 81 continue ; 82 } 83 switch (c){ 84 case 'A' : 85 case 'B' : 86 case 'C' : 87 cs[i++] = '2'; 88 break ; 89 case 'D' : 90 case 'E' : 91 case 'F' : 92 cs[i++] = '3'; 93 break ; 94 case 'G' : 95 case 'H' : 96 case 'I' : 97 cs[i++] = '4'; 98 break ; 99 case 'J' : 100 case 'K' : 101 case 'L' : 102 cs[i++] = '5'; 103 break ; 104 case 'M' : 105 case 'N' : 106 case 'O' : 107 cs[i++] = '6'; 108 break ; 109 case 'P' : 110 case 'R' : 111 case 'S' : 112 cs[i++] = '7'; 113 break ; 114 case 'T' : 115 case 'U' : 116 case 'V' : 117 cs[i++] = '8'; 118 break ; 119 case 'W' : 120 case 'X' : 121 case 'Y' : 122 cs[i++] = '9'; 123 break ; 124 default : 125 break ; 126 } 127 n++; 128 } 129 num = atol(cs); 130 return num; 131 132 } 133 134 void insert(directory *now,directory *tels){ 135 136 if(tels->tel>now->tel){ 137 if(tels->left == NULL){ 138 tels->left = now; 139 return ; 140 } 141 insert(now,tels->left); 142 return; 143 } 144 if(tels->tel<now->tel){ 145 if(tels->right == NULL){ 146 tels->right = now; 147 return ; 148 } 149 insert(now,tels->right); 150 return; 151 } 152 if(tels->tel == now->tel) 153 tels->number++; 154 return; 155 } 156 157 int printd(directory *tels){ 158 if(tels == NULL) 159 return 0; 160 161 int n = 0; 162 n += printd(tels->left); 163 if(tels->number>1){ 164 cout<<tels->tel/10000<<"-"<<tels->tel%10000<<" "<<tels->number<<endl; 165 n += 1; 166 } 167 n += printd(tels->right); 168 return n; 169 }

浙公网安备 33010602011771号