2013年去哪网实习笔试题
【题目】
有一个文件存储了一个酒店业主对其酒店标准间的报价,数据是按行存储,每行的数据表示一个日期段内的价格。
格式如下:2013-09-01~2013-11-01 200
这行数据表示2013-09-01到2013-11-01这个时间段内的价格都是200
请写程序,读取文件中的数据,生成合并好的日期段价格数据按照起始日期升序排序好,输出到另外一个文件(output.txt)
合并的规则如下:
- 日期相同的价格以后面的为准
- 相邻日期、价格相同的数据需要合并日期
例如
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 }
浙公网安备 33010602011771号