【九度OJ】1022【模拟】

做这道题时因为有与之前的题相似的地方,所以就学了一下其他人的排序的方法,用了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。

看来以后做题要灵活一些,不能总是按照老思路!这种思想确实值得借鉴!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值