做这道题时因为有与之前的题相似的地方,所以就学了一下其他人的排序的方法,用了List,Comparable和Collections.sort接口。不过时间也不是最优的,为130MS。
采用List存储每条记录,Comparable接口对各条记录进行排序比较。Date类求时间差。BigDecimal四舍五入(Math.round可以更方便得对正数四舍五入,为加0.5后向下取整)
代码:
package Test1;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
public class Test9_1022 {
/**
* by qr jobdu 1022 2014-8-9
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {
Scanner scan = new Scanner(System.in);
List<Record> rec = new ArrayList<Record>(); //!!
DateFormat df=new SimpleDateFormat("HH:mm"); //!!
while (true) {
int boatnum = scan.nextInt(); // boat number
if (boatnum == -1) // 没有继续的输入,在这里就要判断
break;
String seflag = scan.next(); // S/E
String time = scan.next(); // time
if (boatnum == 0) {
if (rec.size() == 0) {
System.out.println("0 0");
} else {
Collections.sort(rec); //!!
int totaltime=0;
int number=0;
for(int i=0;i<rec.size()-1;i++){ //rec.size()-1 !!
if(rec.get(i).boatnum==rec.get(i+1).boatnum){
Date d1=df.parse(rec.get(i).time); //!!
Date d2=df.parse(rec.get(i+1).time);
totaltime+=(d2.getTime()-d1.getTime())/(1000*60); //获取分钟差,getTime得到的是秒。并且要再除以1000才能得到分钟
number++;
i++;
}
}
System.out.println(number+" "+new BigDecimal((double)totaltime/number).setScale(0,BigDecimal.ROUND_HALF_UP)); //!!!!
}
rec.clear(); //do not forget!!
continue;
} else { // add record
rec.add(new Record(boatnum, seflag, time));
}
}
}
}
class Record implements Comparable<Record> {
int boatnum;
String SEFlag;
String time;
Record() {
}
Record(int boatnum, String SEFlag, String time) {
this.boatnum = boatnum;
this.SEFlag = SEFlag;
this.time = time;
}
@Override
public int compareTo(Record re1) { //!!
if (re1.boatnum != this.boatnum)
return this.boatnum - re1.boatnum; // (Java)>0 ---> exchange
else
return this.time.compareTo(re1.time);
}
public String toString() {
return boatnum + " " + SEFlag + " " + time;
}
}
读了其他人的一份时间更优的代码,70MS。做法是,采用map存储记录,在读入记录的过程中就将具有开始和结束的记录的时间差值存入map中了,而非全都读入后再判断,这样最后只需找到具有E标签的元素了,其他的只可能是只有S标签的元素,只有E标签的记录根本不会存入map。
看来以后做题要灵活一些,不能总是按照老思路!这种思想确实值得借鉴!!