2013年去哪网实习笔试题
2013-05-13 08:28
141 查看
【题目】
有一个文件存储了一个酒店业主对其酒店标准间的报价,数据是按行存储,每行的数据表示一个日期段内的价格。
格式如下: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版代码,请各位网友批评指正,今天去哪网陆续开始电话面试!
有一个文件存储了一个酒店业主对其酒店标准间的报价,数据是按行存储,每行的数据表示一个日期段内的价格。
格式如下: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版代码,请各位网友批评指正,今天去哪网陆续开始电话面试!
import java.io.*; import java.util.ArrayList; import java.util.List; public class QuotedPrice{ private String startDate = ""; private String endDate = ""; private double price = 0.0; public QuotedPrice(){} public QuotedPrice(String startDate, String endDate, double price) { this.startDate = startDate; this.endDate = endDate; this.price = price; } public String getStartDate() { return startDate; } public void setStartDate(String startDate) { this.startDate = startDate; } public String getEndDate() { return endDate; } public void setEndDate(String endDate) { this.endDate = endDate; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public static List<QuotedPrice> sortQuotedPrice(List unsortedQPList){ List<QuotedPrice> sortedQPList = new ArrayList<QuotedPrice>(); //根据需求日期相同的价格以后面的为准,因此选择从后面开始遍历 for(int unsortedQPVar = unsortedQPList.size()-1; unsortedQPVar > -1; unsortedQPVar--){ QuotedPrice unsortedQP = (QuotedPrice)unsortedQPList.get(unsortedQPVar); //将最下方的数据添加到已处理的数据集中 if(sortedQPList.size() == 0){ sortedQPList.add(unsortedQP); continue; } if (judge(0, sortedQPList, unsortedQP) == 0){ continue; } } //对处理结果进行排序 for(int i = 0; i < sortedQPList.size()-1; i++){ for (int j = 0; j < sortedQPList.size()-i-1 ; j++) { QuotedPrice max = (QuotedPrice)sortedQPList.get(j); QuotedPrice current = (QuotedPrice)sortedQPList.get(j+1); if(max.getStartDate().compareTo(current.getStartDate()) > 0){ QuotedPrice item = new QuotedPrice(max.getStartDate(),max.getEndDate(),max.getPrice()); sortedQPList.set(j, current); sortedQPList.set(j+1, item); } } } return sortedQPList; } public static int judge(int sortedStartVar, List<QuotedPrice> sortedQPList, QuotedPrice unsortedQP){ //sortedStartVar作用,避免对已经判断的数据再进行判断以提高效率 int result = 1; QuotedPrice sortedQP = (QuotedPrice)sortedQPList.get(sortedStartVar); //如果待处理数据的时间段与已处理的数据的时间段没有交集,则继续与其他已处理的数据进行比较 if( unsortedQP.getStartDate().compareTo(sortedQP.getEndDate()) >= 0 || unsortedQP.getEndDate().compareTo(sortedQP.getStartDate()) <= 0){ if( unsortedQP.getStartDate().compareTo(sortedQP.getEndDate()) == 0){ unsortedQP.setStartDate(getNextDay(unsortedQP.getStartDate())); } if(unsortedQP.getEndDate().compareTo(sortedQP.getStartDate()) == 0){ unsortedQP.setEndDate(getPreviousDay(unsortedQP.getEndDate())); } if((sortedStartVar+1) == sortedQPList.size()){ sortedQPList.add(unsortedQP); return 0; }else{ judge(sortedStartVar+1, sortedQPList,unsortedQP); return 0; } } //如果待处理数据的时间段被包含在已处理的数据的时间段之内,退出循环 if( unsortedQP.getStartDate().compareTo(sortedQP.getStartDate()) >= 0 && unsortedQP.getEndDate().compareTo(sortedQP.getEndDate()) <= 0){ return 0; } //如果待处理数据的时间段与已处理的数据的时间段左侧有交集,则将待处理数据的结束日期给位已处理数据的起始时间,并继续与其他已处理数据进行比较 if(unsortedQP.getStartDate().compareTo(sortedQP.getEndDate()) <= 0 && unsortedQP.getEndDate().compareTo(sortedQP.getEndDate()) <= 0 && unsortedQP.getEndDate().compareTo(sortedQP.getEndDate()) >= 0 ){ unsortedQP.setEndDate(getPreviousDay(sortedQP.getStartDate())); if((sortedStartVar+1) == sortedQPList.size()){ sortedQPList.add(unsortedQP); return 0; }else{ judge(sortedStartVar+1, sortedQPList,unsortedQP); return 0; } } //如果待处理数据的时间段与已处理的数据的时间段右侧有交集,则将待处理数据的结束日期给位已处理数据的起始时间,并继续与其他已处理数据进行比较 if(unsortedQP.getStartDate().compareTo(sortedQP.getStartDate()) >=0 && unsortedQP.getEndDate().compareTo(sortedQP.getEndDate()) >= 0 && unsortedQP.getStartDate().compareTo(sortedQP.getEndDate()) <= 0 ){ unsortedQP.setStartDate(getNextDay(sortedQP.getEndDate())); if((sortedStartVar+1) == sortedQPList.size()){ sortedQPList.add(unsortedQP); return 0; }else{ judge(sortedStartVar+1, sortedQPList,unsortedQP); return 0; } } //如果待处理数据的时间段包含已处理的数据的时间段,则将待处理数据截出两侧再与其他已处理的数据进行比较 if( unsortedQP.getStartDate().compareTo(sortedQP.getStartDate()) <= 0 && unsortedQP.getEndDate().compareTo(sortedQP.getEndDate()) >= 0){ QuotedPrice leftQuotedPrice = new QuotedPrice(unsortedQP.getStartDate(), getPreviousDay(sortedQP.getStartDate()), unsortedQP.getPrice()); QuotedPrice rightQuotedPrice = new QuotedPrice(getNextDay(sortedQP.getEndDate()), unsortedQP.getEndDate(), unsortedQP.getPrice()); if((sortedStartVar+1) == sortedQPList.size()){ sortedQPList.add(leftQuotedPrice); sortedQPList.add(rightQuotedPrice); return 0; }else{ judge(sortedStartVar+1, sortedQPList,leftQuotedPrice); judge(sortedStartVar+1, sortedQPList,rightQuotedPrice); return 0; } } return 0; } public static void printQuotedPrice(List<QuotedPrice> sortedQuotedPriceList, String outPath){ try{ OutputStream os = new FileOutputStream(outPath); String line = ""; for(int sortedQPVar = 0; sortedQPVar < sortedQuotedPriceList.size(); sortedQPVar++){ QuotedPrice sortedQuotedPrice = (QuotedPrice)sortedQuotedPriceList.get(sortedQPVar); line = sortedQuotedPrice.getStartDate() + "~" + sortedQuotedPrice.getEndDate() + " " + sortedQuotedPrice.getPrice(); PrintWriter writer = new PrintWriter(new OutputStreamWriter(os)); writer.println(line); writer.flush(); } }catch (IOException ioe){ System.out.println(ioe); } } public static String getPreviousDay(String currentDay){ String previousDay = ""; try{ String[] ymd = currentDay.split("-"); int year = Integer.parseInt(ymd[0]); int month = Integer.parseInt(ymd[1]); int day = Integer.parseInt(ymd[2]); if(day > 1){ day = day - 1; }else{ switch (month){ case 1:day = 31; month = 12; year = year - 1;break; case 2:day = 31; month = 1;break; case 3: if(year%100 == 0 && year%400 == 0){ day = 29; } else if(year%100 != 0 && year%4 == 0){ day = 29; }else{ day = 28; } month = 2; break; case 4:day = 31;month = 3;break; case 5:day = 30;month = 4;break; case 6:day = 31;month = 5;break; case 7:day = 30;month = 6;break; case 8:day = 31;month = 7;break; case 9:day = 31;month = 8;break; case 10:day = 30;month = 9;break; case 11:day = 31; month = 10;break; case 12:day = 30; month = 11;break; } } previousDay = year + "-" + (month > 9 ? "" + month : "0" + month) + "-" + (day > 9 ? "" + day : "0" + day); }catch (Exception e){ System.out.println(e); } return previousDay; } public static String getNextDay(String currentDay){ String nextDay = ""; String[] ymd = currentDay.split("-"); int year = Integer.parseInt(ymd[0]); int month = Integer.parseInt(ymd[1]); int day = Integer.parseInt(ymd[2]); switch (month) { case 1: if(day == 31){ day = 1; month = 2; break; }else{ day = day + 1; break; } case 2: if (year % 100 == 0 && year % 400 == 0) { if(day == 29){ day = 1; month = 3; break; }else{ day = day + 1; break; } } else if (year % 100 != 0 && year % 4 == 0) { if(day == 29){ day = 1; month = 3; break; }else{ day = day + 1; break; } } else { if(day == 28){ day = 1; month = 3; break; }else{ day = day + 1; break; } } case 3: if(day == 31){ day = 1; month = 4; break; }else{ day = day + 1; break; } case 4: if(day == 30){ day = 1; month = 5; break; }else{ day = day + 1; break; } case 5: if(day == 31){ day = 1; month = 6; break; }else{ day = day + 1; break; } case 6: if(day == 30){ day = 1; month = 7; break; }else{ day = day + 1; break; } case 7: if(day == 31){ day = 1; month = 8; break; }else{ day = day + 1; break; } case 8: if(day == 31){ day = 1; month = 9; break; }else{ day = day + 1; break; } case 9: if(day == 30){ day = 1; month = 10; break; }else{ day = day + 1; break; } case 10: if(day == 31){ day = 1; month = 11; break; }else{ day = day + 1; break; } case 11: if(day == 30){ day = 1; month = 12; break; }else{ day = day + 1; break; } case 12: if(day == 31){ day = 1; month = 1; year = year + 1; break; }else{ day = day + 1; break; } } nextDay = year + "-" + (month > 9 ? "" + month : "0" + month) + "-" + (day > 9 ? "" + day : "0" + day); return nextDay; } public static List<QuotedPrice> textToObject(String path){ List <QuotedPrice> unsortQPList = new ArrayList<QuotedPrice>(); try{ InputStream is = new FileInputStream(path); String line; BufferedReader reader = new BufferedReader(new InputStreamReader(is)); line = reader.readLine(); String[] firstDatePriceArr = line.split(" "); String[] firstDateArr = firstDatePriceArr[0].split("~"); QuotedPrice firstUnsortQP = new QuotedPrice(firstDateArr[0], firstDateArr[1], Double.parseDouble(firstDatePriceArr[1])); unsortQPList.add(firstUnsortQP); while (line != null) { line = reader.readLine(); if(line == null || "".equals(line)){ continue; } String[] datePriceArr = line.split(" "); String[] dateArr = datePriceArr[0].split("~"); QuotedPrice unsortQP = new QuotedPrice(dateArr[0], dateArr[1], Double.parseDouble(datePriceArr[1])); unsortQPList.add(unsortQP); } is.close(); }catch(IOException ioe){ System.out.println(ioe); } return unsortQPList; } public static void main(String[] args){ List <QuotedPrice> unsortQPList = QuotedPrice.textToObject("I:\\test.txt"); QuotedPrice.printQuotedPrice(QuotedPrice.sortQuotedPrice(unsortQPList), "I:\\output.txt"); } }
相关文章推荐
- 微软2013年暑期实习招聘笔试回忆[已补充完整]
- [转] 2013年阿里巴巴暑期实习招聘笔试题目
- 2013年阿里巴巴暑期实习招聘笔试题目及部分答案
- 2013年阿里巴巴暑期实习招聘笔试题目及部分答案——5月5日
- 2013年阿里巴巴暑期实习招聘笔试题目(不完整,笔试时间:2013.5.5)
- 2013年阿里巴巴暑期实习招聘笔试题目及部分答案——5月5日
- 微软2013年暑期实习招聘笔试回忆[已补充完整]
- 2013年阿里巴巴暑期实习招聘笔试题目(转)
- 微软2013年实习招聘笔试“22221111”题目详解
- 【job】2013年5-5阿里巴巴暑期实习招聘笔试题目及部分答案
- 2013年几道腾讯实习笔试题
- 2013年阿里巴巴暑期实习招聘笔试题目及部分答案——5月5日
- 2013年阿里巴巴暑期实习招聘笔试题目及部分答案——5月5日
- 微软2013年暑期实习招聘笔试回忆[转载]
- 概率小数2013年阿里巴巴暑期实习招聘笔试题目(不完整,笔试时间:2013.5.5)
- 2013年5-5阿里巴巴暑期实习招聘笔试题目及部分答案
- 2012微软笔试题(暑期实习招聘)
- 微软2013年笔试题详解及深入
- 暑期实习4月份笔试试题解答-Android 工程师(3)
- 2012百度笔试题 - 实习软件研发工程师