题解 | ranko的手表
ranko的手表
https://www.nowcoder.com/practice/37275e85ae7c4453920eae6b9f7f45fc
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String t1Str = scanner.nextLine();
String t2Str = scanner.nextLine();
List<Integer> t1List = generatePossibleTimes(t1Str);
List<Integer> t2List = generatePossibleTimes(t2Str);
int minDiff = Integer.MAX_VALUE;
int maxDiff = Integer.MIN_VALUE;
for (int t1 : t1List) {
for (int t2 : t2List) {
if (t2 > t1) {
int diff = t2 - t1;
if (diff < minDiff) {
minDiff = diff;
}
if (diff > maxDiff) {
maxDiff = diff;
}
}
}
}
System.out.println(minDiff + " " + maxDiff);
}
private static List<Integer> generatePossibleTimes(String timeStr) {
String[] parts = timeStr.split(":");
String hhPart = parts[0];
String mmPart = parts[1];
List<Integer> hours = generatePossibleHours(hhPart);
List<Integer> minutes = generatePossibleMinutes(mmPart);
List<Integer> times = new ArrayList<>();
for (int h : hours) {
for (int m : minutes) {
times.add(h * 60 + m);
}
}
return times;
}
private static List<Integer> generatePossibleHours(String hh) {
List<Integer> possible = new ArrayList<>();
char h1Char = hh.charAt(0);
char h2Char = hh.charAt(1);
List<Integer> h1Candidates = new ArrayList<>();
if (h1Char == '?') {
h1Candidates.add(0);
h1Candidates.add(1);
h1Candidates.add(2);
} else {
h1Candidates.add(h1Char - '0');
}
List<Integer> h2Candidates = new ArrayList<>();
if (h2Char == '?') {
for (int i = 0; i <= 9; i++) {
h2Candidates.add(i);
}
} else {
h2Candidates.add(h2Char - '0');
}
for (int h1 : h1Candidates) {
for (int h2 : h2Candidates) {
int hour = h1 * 10 + h2;
if (hour >= 0 && hour <= 23) {
possible.add(hour);
}
}
}
return possible;
}
private static List<Integer> generatePossibleMinutes(String mm) {
List<Integer> possible = new ArrayList<>();
char m1Char = mm.charAt(0);
char m2Char = mm.charAt(1);
List<Integer> m1Candidates = new ArrayList<>();
if (m1Char == '?') {
for (int i = 0; i <= 5; i++) {
m1Candidates.add(i);
}
} else {
m1Candidates.add(m1Char - '0');
}
List<Integer> m2Candidates = new ArrayList<>();
if (m2Char == '?') {
for (int i = 0; i <= 9; i++) {
m2Candidates.add(i);
}
} else {
m2Candidates.add(m2Char - '0');
}
for (int m1 : m1Candidates) {
for (int m2 : m2Candidates) {
int minute = m1 * 10 + m2;
if (minute >= 0 && minute <= 59) {
possible.add(minute);
}
}
}
return possible;
}
}
这一题做出来是不难的,直接枚举所有情况,然后转换为分钟来比较就可以了。但是性能的确会低一些。
但是要求性能高的可读性就会变得十分差,而且容易出错,比如性能排名第一的这个提交(https://www.nowcoder.com/discuss/692882813296594944?sourceSSR=users),就出错了(我已在评论中指出)。
所以我还是选择追求可读性了。
查看21道真题和解析