您的位置:首页 > 其它

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版代码,请各位网友批评指正,今天去哪网陆续开始电话面试!

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");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: