PAT 甲级 1006 Sign In and Sign Out (25 分)(Java)
题目
题目链接
题意解读
这题的大意就是要根据时间,找出最早到的和最晚离开的;
解题思路
思路一:首先想到的是通过相应的数据结构记录相应的名称,开始时间,结束时间,然后通过数组保存所有的数据,然后通过排序判定最早到的时间和最晚走的时间;
思路二:这题的简便方法就是将这种带格式的时间全部转换成秒数,然后记录最小的秒数和最大的秒数,就是进入最早和离开最晚的人;
解法
解法一
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
class Ti{
String name;
int start;
int end;
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
sc.nextLine();
Ti[] d = new Ti[m];
for (int i = 0; i < m; i++) {
d[i] = new Ti();
String[] st = sc.nextLine().split(" ");
d[i].name = st[0];
String[] s1 = st[1].split(":");
d[i].start = Integer.valueOf(s1[0])*3600 + Integer.valueOf(s1[1])*60 + Integer.valueOf(s1[2]);
String[] s2 = st[2].split(":");
d[i].end = Integer.valueOf(s2[0])*3600 + Integer.valueOf(s2[1])*60 + Integer.valueOf(s2[2]);
}
Arrays.sort(d, new Comparator<Ti>() {
@Override
public int compare(Ti o1, Ti o2) {
return o1.start - o2.start;
}
});
System.out.print(d[0].name + " ");
Arrays.sort(d, new Comparator<Ti>() {
@Override
public int compare(Ti o1, Ti o2) {
return o2.end - o1.end;
}
});
System.out.println(d[0].name);
}
}
解法二
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
sc.nextLine();
String[] name = new String[m];
int startIndex = -1;
int endIndex = -1;
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int i = 0; i < m; i++) {
String[] st = sc.nextLine().split(" ");
name[i] = st[0];
String[] s1 = st[1].split(":");
int start = Integer.valueOf(s1[0])*3600 + Integer.valueOf(s1[1])*60 + Integer.valueOf(s1[2]);
if(start < min){
min = start;
startIndex = i;
}
String[] s2 = st[2].split(":");
int end = Integer.valueOf(s2[0])*3600 + Integer.valueOf(s2[1])*60 + Integer.valueOf(s2[2]);
if(end > max){
max = end;
endIndex = i;
}
}
System.out.println(name[startIndex] + " " + name[endIndex]);
}
}
|