X周

导航

2013年去哪网实习笔试题

【题目】

有一个文件存储了一个酒店业主对其酒店标准间的报价,数据是按行存储,每行的数据表示一个日期段内的价格。

格式如下:2013-09-01~2013-11-01 200

这行数据表示2013-09-01到2013-11-01这个时间段内的价格都是200

请写程序,读取文件中的数据,生成合并好的日期段价格数据按照起始日期升序排序好,输出到另外一个文件(output.txt)

合并的规则如下:

  1. 日期相同的价格以后面的为准
  2. 相邻日期、价格相同的数据需要合并日期

例如

2013-09-01~2013-10-31 200

2013-10-01~2013-10-07 500

2013-11-01~2013-12-31 200

合并过后的结果就是

2013-09-01~2013-09-30 200

2013-10-01~2013-10-07 500

2013-10-08~2013-12-31 200

稍后会给出答案!!!

下面是java版代码,请各位网友批评指正,今天去哪网陆续开始电话面试!

  1 import java.io.*;
  2 import java.util.ArrayList;
  3 import java.util.List;
  4 public class QuotedPrice{
  5 
  6     private String startDate = "";
  7     private String endDate = "";
  8     private double price = 0.0;
  9 
 10     public QuotedPrice(){}
 11     public QuotedPrice(String startDate, String endDate, double price) {
 12         this.startDate = startDate;
 13         this.endDate = endDate;
 14         this.price = price;
 15     }
 16 
 17  public String getStartDate() {
 18         return startDate;
 19     }
 20 
 21     public void setStartDate(String startDate) {
 22         this.startDate = startDate;
 23     }
 24 
 25     public String getEndDate() {
 26         return endDate;
 27     }
 28 
 29     public void setEndDate(String endDate) {
 30         this.endDate = endDate;
 31     }
 32 
 33     public double getPrice() {
 34         return price;
 35     }
 36 
 37     public void setPrice(double price) {
 38         this.price = price;
 39     }
 40 
 41     public static List<QuotedPrice> sortQuotedPrice(List unsortedQPList){
 42         List<QuotedPrice> sortedQPList = new ArrayList<QuotedPrice>();
 43         //根据需求日期相同的价格以后面的为准,因此选择从后面开始遍历
 44         for(int unsortedQPVar = unsortedQPList.size()-1; unsortedQPVar > -1; unsortedQPVar--){
 45             QuotedPrice unsortedQP = (QuotedPrice)unsortedQPList.get(unsortedQPVar);
 46             //将最下方的数据添加到已处理的数据集中
 47             if(sortedQPList.size() == 0){
 48                 sortedQPList.add(unsortedQP);
 49                 continue;
 50             }
 51             if (judge(0, sortedQPList, unsortedQP) == 0){
 52                 continue;
 53             }
 54         }
 55 
 56         //对处理结果进行排序
 57         for(int i = 0; i < sortedQPList.size()-1; i++){
 58             for (int j = 0; j < sortedQPList.size()-i-1 ; j++) {
 59                 QuotedPrice max = (QuotedPrice)sortedQPList.get(j);
 60                 QuotedPrice current = (QuotedPrice)sortedQPList.get(j+1);
 61                 if(max.getStartDate().compareTo(current.getStartDate()) > 0){
 62                     QuotedPrice item = new QuotedPrice(max.getStartDate(),max.getEndDate(),max.getPrice());
 63                     sortedQPList.set(j, current);
 64                     sortedQPList.set(j+1, item);
 65                 }
 66             }
 67         }
 68         return sortedQPList;
 69     }
 70 
 71   public static int judge(int sortedStartVar, List<QuotedPrice> sortedQPList, QuotedPrice unsortedQP){            //sortedStartVar作用,避免对已经判断的数据再进行判断以提高效率
 72         int result = 1;
 73             QuotedPrice sortedQP = (QuotedPrice)sortedQPList.get(sortedStartVar);
 74             //如果待处理数据的时间段与已处理的数据的时间段没有交集,则继续与其他已处理的数据进行比较
 75             if( unsortedQP.getStartDate().compareTo(sortedQP.getEndDate()) >= 0 || unsortedQP.getEndDate().compareTo(sortedQP.getStartDate()) <= 0){
 76                 if( unsortedQP.getStartDate().compareTo(sortedQP.getEndDate()) == 0){
 77                     unsortedQP.setStartDate(getNextDay(unsortedQP.getStartDate()));
 78                 }
 79                 if(unsortedQP.getEndDate().compareTo(sortedQP.getStartDate()) == 0){
 80                     unsortedQP.setEndDate(getPreviousDay(unsortedQP.getEndDate()));
 81                 }
 82                 if((sortedStartVar+1) == sortedQPList.size()){
 83                     sortedQPList.add(unsortedQP);
 84                     return 0;
 85                 }else{
 86                     judge(sortedStartVar+1, sortedQPList,unsortedQP);
 87                     return 0;
 88                 }
 89             }
 90             //如果待处理数据的时间段被包含在已处理的数据的时间段之内,退出循环
 91             if( unsortedQP.getStartDate().compareTo(sortedQP.getStartDate()) >= 0 && unsortedQP.getEndDate().compareTo(sortedQP.getEndDate()) <= 0){
 92                 return 0;
 93             }
 94             //如果待处理数据的时间段与已处理的数据的时间段左侧有交集,则将待处理数据的结束日期给位已处理数据的起始时间,并继续与其他已处理数据进行比较
 95             if(unsortedQP.getStartDate().compareTo(sortedQP.getEndDate()) <= 0 && unsortedQP.getEndDate().compareTo(sortedQP.getEndDate()) <= 0 && unsortedQP.getEndDate().compareTo(sortedQP.getEndDate()) >= 0 ){
 96                 unsortedQP.setEndDate(getPreviousDay(sortedQP.getStartDate()));
 97                 if((sortedStartVar+1) == sortedQPList.size()){
 98                     sortedQPList.add(unsortedQP);
 99                     return 0;
100                 }else{
101                     judge(sortedStartVar+1, sortedQPList,unsortedQP);
102                     return 0;
103                 }
104             }
105             //如果待处理数据的时间段与已处理的数据的时间段右侧有交集,则将待处理数据的结束日期给位已处理数据的起始时间,并继续与其他已处理数据进行比较
106             if(unsortedQP.getStartDate().compareTo(sortedQP.getStartDate()) >=0  && unsortedQP.getEndDate().compareTo(sortedQP.getEndDate()) >= 0 && unsortedQP.getStartDate().compareTo(sortedQP.getEndDate()) <= 0 ){
107                 unsortedQP.setStartDate(getNextDay(sortedQP.getEndDate()));
108                 if((sortedStartVar+1) == sortedQPList.size()){
109                     sortedQPList.add(unsortedQP);
110                     return 0;
111                 }else{
112                     judge(sortedStartVar+1, sortedQPList,unsortedQP);
113                     return 0;
114                 }
115             }
116             //如果待处理数据的时间段包含已处理的数据的时间段,则将待处理数据截出两侧再与其他已处理的数据进行比较
117             if( unsortedQP.getStartDate().compareTo(sortedQP.getStartDate()) <= 0 && unsortedQP.getEndDate().compareTo(sortedQP.getEndDate()) >= 0){
118                 QuotedPrice leftQuotedPrice = new QuotedPrice(unsortedQP.getStartDate(), getPreviousDay(sortedQP.getStartDate()), unsortedQP.getPrice());
119                 QuotedPrice rightQuotedPrice = new QuotedPrice(getNextDay(sortedQP.getEndDate()), unsortedQP.getEndDate(), unsortedQP.getPrice());
120 
121                 if((sortedStartVar+1) == sortedQPList.size()){
122                     sortedQPList.add(leftQuotedPrice);
123                     sortedQPList.add(rightQuotedPrice);
124                     return 0;
125                 }else{
126                    judge(sortedStartVar+1, sortedQPList,leftQuotedPrice);
127                    judge(sortedStartVar+1, sortedQPList,rightQuotedPrice);
128                     return 0;
129                 }
130             }
131 
132         return 0;
133     }
134     public static void printQuotedPrice(List<QuotedPrice> sortedQuotedPriceList, String outPath){
135 
136         try{
137             OutputStream os = new FileOutputStream(outPath);
138             String line = "";
139             for(int sortedQPVar = 0; sortedQPVar < sortedQuotedPriceList.size(); sortedQPVar++){
140                 QuotedPrice sortedQuotedPrice = (QuotedPrice)sortedQuotedPriceList.get(sortedQPVar);
141                 line = sortedQuotedPrice.getStartDate() + "~" + sortedQuotedPrice.getEndDate() + " " + sortedQuotedPrice.getPrice();
142                 PrintWriter writer = new PrintWriter(new OutputStreamWriter(os));
143                 writer.println(line);
144                 writer.flush();
145             }
146 
147         }catch (IOException ioe){
148             System.out.println(ioe);
149         }
150 
151     }
152     public static String getPreviousDay(String currentDay){
153         String previousDay = "";
154         try{    
155             String[] ymd = currentDay.split("-");
156             int year = Integer.parseInt(ymd[0]);
157             int month = Integer.parseInt(ymd[1]);
158             int day = Integer.parseInt(ymd[2]);
159             if(day > 1){
160                 day = day - 1;
161             }else{
162                 switch (month){
163                     case 1:day = 31; month = 12; year = year - 1;break;
164                     case 2:day = 31; month = 1;break;
165                     case 3:
166                         if(year%100 == 0 && year%400 == 0){
167                             day = 29;
168                         }
169                         else if(year%100 != 0 && year%4 == 0){
170                             day = 29;
171                         }else{
172                             day = 28;
173                         }
174                         month = 2;
175                         break;
176                     case 4:day = 31;month = 3;break;
177                     case 5:day = 30;month = 4;break;
178                     case 6:day = 31;month = 5;break;
179                     case 7:day = 30;month = 6;break;
180                     case 8:day = 31;month = 7;break;
181                     case 9:day = 31;month = 8;break;
182                     case 10:day = 30;month = 9;break;
183                     case 11:day = 31; month = 10;break;
184                     case 12:day = 30; month = 11;break;
185                 }
186             }
187             previousDay = year + "-" + (month > 9 ? "" + month : "0" + month)  + "-" + (day > 9 ? "" + day : "0" + day);
188         }catch (Exception e){
189             System.out.println(e);
190         }
191         return previousDay;
192     }
193     public static String getNextDay(String currentDay){
194         String nextDay = "";
195         String[] ymd = currentDay.split("-");
196         int year = Integer.parseInt(ymd[0]);
197         int month = Integer.parseInt(ymd[1]);
198         int day = Integer.parseInt(ymd[2]);
199         switch (month) {
200             case 1:
201                 if(day == 31){
202                     day = 1;
203                     month = 2;
204                     break;
205                 }else{
206                     day = day + 1;
207                     break;
208                 }
209             case 2:
210                 if (year % 100 == 0 && year % 400 == 0) {
211                     if(day == 29){
212                         day = 1;
213                         month = 3;
214                         break;
215                     }else{
216                         day = day + 1;
217                         break;
218                     }
219                 } else if (year % 100 != 0 && year % 4 == 0) {
220                     if(day == 29){
221                         day = 1;
222                         month = 3;
223                         break;
224                     }else{
225                         day = day + 1;
226                         break;
227                     }
228                 } else {
229                     if(day == 28){
230                         day = 1;
231                         month = 3;
232                         break;
233                     }else{
234                         day = day + 1;
235                         break;
236                     }
237                 }
238             case 3:
239                 if(day == 31){
240                     day = 1;
241                     month = 4;
242                     break;
243                 }else{
244                     day = day + 1;
245                     break;
246                 }
247             case 4:
248                 if(day == 30){
249                     day = 1;
250                     month = 5;
251                     break;
252                 }else{
253                     day = day + 1;
254                     break;
255                 }
256             case 5:
257                 if(day == 31){
258                     day = 1;
259                     month = 6;
260                     break;
261                 }else{
262                     day = day + 1;
263                     break;
264                 }
265             case 6:
266                 if(day == 30){
267                     day = 1;
268                     month = 7;
269                     break;
270                 }else{
271                     day = day + 1;
272                     break;
273                 }
274             case 7:
275                 if(day == 31){
276                     day = 1;
277                     month = 8;
278                     break;
279                 }else{
280                     day = day + 1;
281                     break;
282                 }
283             case 8:
284                 if(day == 31){
285                     day = 1;
286                     month = 9;
287                     break;
288                 }else{
289                     day = day + 1;
290                     break;
291                 }
292             case 9:
293                 if(day == 30){
294                     day = 1;
295                     month = 10;
296                     break;
297                 }else{
298                     day = day + 1;
299                     break;
300                 }
301             case 10:
302                 if(day == 31){
303                     day = 1;
304                     month = 11;
305                     break;
306                 }else{
307                     day = day + 1;
308                     break;
309                 }
310             case 11:
311                 if(day == 30){
312                     day = 1;
313                     month = 12;
314                     break;
315                 }else{
316                     day = day + 1;
317                     break;
318                 }
319             case 12:
320                 if(day == 31){
321                     day = 1;
322                     month = 1;
323                     year = year + 1;
324                     break;
325                 }else{
326                     day = day + 1;
327                     break;
328                 }
329         }
330         nextDay = year + "-" + (month > 9 ? "" + month : "0" + month)  + "-" + (day > 9 ? "" + day : "0" + day);
331         return nextDay;
332     }
333 
334     public static List<QuotedPrice> textToObject(String path){
335         List <QuotedPrice> unsortQPList = new ArrayList<QuotedPrice>();
336         try{
337             InputStream is = new FileInputStream(path);
338             String line; 
339             BufferedReader reader = new BufferedReader(new InputStreamReader(is));
340 
341             line = reader.readLine(); 
342             String[] firstDatePriceArr = line.split(" ");
343             String[] firstDateArr = firstDatePriceArr[0].split("~");
344             QuotedPrice firstUnsortQP = new QuotedPrice(firstDateArr[0], firstDateArr[1], Double.parseDouble(firstDatePriceArr[1]));
345             unsortQPList.add(firstUnsortQP);
346             while (line != null) { 
347                 line = reader.readLine();
348                 if(line == null || "".equals(line)){
349                     continue;
350                 }
351                 String[] datePriceArr = line.split(" ");
352                 String[] dateArr = datePriceArr[0].split("~");
353                 QuotedPrice unsortQP = new QuotedPrice(dateArr[0], dateArr[1], Double.parseDouble(datePriceArr[1]));
354                 unsortQPList.add(unsortQP);
355             }
356             is.close();
357         }catch(IOException ioe){
358             System.out.println(ioe);
359         }
360         return unsortQPList;
361     }
362 
363 
364     public static void main(String[] args){
365         List <QuotedPrice> unsortQPList = QuotedPrice.textToObject("I:\\test.txt");
366             QuotedPrice.printQuotedPrice(QuotedPrice.sortQuotedPrice(unsortQPList), "I:\\output.txt");
367     }
368 }

 

posted on 2013-05-13 08:28  X周  阅读(654)  评论(0)    收藏  举报