白禾二少

静水流深

导航

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 }

 

 

posted on 2012-11-29 14:21  白禾二少  阅读(193)  评论(0)    收藏  举报