题解 | ranko的手表
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 // 注意 while 处理多个 case String t1 = in.nextLine(); String t2 = in.nextLine(); String resultStr = compareValue(calcHourValue(splitPos(t1)), calcMinValue(splitPos(t1)), calcHourValue(splitPos(t2)), calcMinValue(splitPos(t2))); System.out.println(resultStr); } public static String compareValue(String t1h, String t1m, String t2h, String t2m) { StringBuffer hourSB = new StringBuffer(); StringBuffer minSB = new StringBuffer(); StringBuffer nMinSB = new StringBuffer(); for (String i : t2h.split(",")) { for (String j : t1h.split(",")) { int r = Integer.valueOf(i) - Integer.valueOf(j); if (r >= 0 && hourSB.indexOf(r + ",") == -1) { hourSB.append(r + ","); } } } for (String i : t2m.split(",")) { for (String j : t1m.split(",")) { int r = Integer.valueOf(i) - Integer.valueOf(j); if (r >= 0) { if (minSB.indexOf(r + ",") == -1) { minSB.append(r + ","); } } else { if (nMinSB.indexOf(r + ",") == -1) { nMinSB.append(r + ","); } } } } if (hourSB.length() == 0) { //t1的hour比t2的hour大 return "0 0"; } else { hourSB.deleteCharAt(hourSB.length() - 1); } if (minSB.length() != 0) { minSB.deleteCharAt(minSB.length() - 1); } if (nMinSB.length() != 0) { nMinSB.deleteCharAt(nMinSB.length() - 1); } String[] hourArray = arraySort(hourSB.toString().split(",")); String[] minArray = arraySort(minSB.toString().split(",")); String[] nMinArray = arraySort(nMinSB.toString().split(",")); if ("".equals(minArray[0]) && "".equals(nMinArray[0])) { return "0 0"; } else if (!"".equals(minArray[0]) && "".equals(nMinArray[0])) { nMinArray[0] = minArray[0]; } else if ("".equals(minArray[0]) && !"".equals(nMinArray[0])) { minArray[0] = nMinArray[nMinArray.length - 1]; } int min = 0; int max = 0; max = Integer.valueOf(hourArray[hourArray.length - 1]) * 60 + Integer.valueOf( minArray[minArray.length - 1]); if ("0".equals(hourArray[0])) { if ("0".equals(minArray[0])) { min = Integer.valueOf(minArray[1]); } else { min = Integer.valueOf(minArray[0]); } } else { min = Integer.valueOf(hourArray[0]) * 60 + Integer.valueOf(nMinArray[0]); } return min + " " + max; } public static char[] splitPos(String hour_min) { String[] t_1234 = hour_min.split(":"); String t_12 = t_1234[0]; String t_34 = t_1234[1]; return new char[] {t_12.charAt(0), t_12.charAt(1), t_34.charAt(0), t_34.charAt(1)}; } public static String calcHourValue(char[] chars) { int max = 0; int min = 0; StringBuffer sb = new StringBuffer(); int plus = 1; if (chars[0] == '?' && chars[1] == '?') { max = 23; min = 0; } else if (chars[0] == '?' && chars[1] != '?') { min = transInt(chars[1]); plus = 10; for (int i = 0; i <= 2; i++) { if ((i * 10 + transInt(chars[1])) <= 23) { max = i * 10 + transInt(chars[1]); } else { break; } } } else if (chars[0] != '?' && chars[1] == '?') { min = transInt(chars[0]) * 10; for (int j = 0; j <= 9; j++) { if (transInt(chars[0]) * 10 + j <= 23) { max = transInt(chars[0]) * 10 + j; } else { break; } } } else { max = transInt(chars[0]) * 10 + transInt(chars[1]); min = max; } for (int k = min; k <= max; k += plus) { sb.append(k + ","); } sb.deleteCharAt(sb.length() - 1); return sb.toString(); } public static String calcMinValue(char[] chars) { int max = 0; int min = 0; StringBuffer sb = new StringBuffer(); int plus = 1; if (chars[2] == '?' && chars[3] == '?') { max = 59; min = 0; } else if (chars[2] == '?' && chars[3] != '?') { min = transInt(chars[3]); plus = 10; for (int i = 0; i <= 5; i++) { if ((i * 10 + transInt(chars[3])) <= 59) { max = i * 10 + transInt(chars[3]); } else { break; } } } else if (chars[2] != '?' && chars[3] == '?') { min = transInt(chars[2]) * 10; for (int j = 0; j <= 9; j++) { if (transInt(chars[2]) * 10 + j <= 59) { max = transInt(chars[2]) * 10 + j; } else { break; } } } else { max = transInt(chars[2]) * 10 + transInt(chars[3]); min = max; } for (int k = min; k <= max; k += plus) { sb.append(k + ","); } sb.deleteCharAt(sb.length() - 1); return sb.toString(); } public static Integer transInt(char c) { return Integer.valueOf(String.valueOf(c)); } public static String[] arraySort(String[] unsort) { String[] result = unsort.clone(); String tmp; for (int j = 0; j < result.length - 1; j++) { for (int i = 0; i < result.length - 1 - j; i++) { if (Integer.valueOf(result[i]) > Integer.valueOf(result[i + 1])) { tmp = result[i + 1]; result[i + 1] = result[i]; result[i] = tmp; } } } return result; } }
大概,就是。。。。。。先把自己实现方式用到的类贴到编码框看看能不能用。不能用的话就要写工具方法,这时候可以考虑代码重用的问题。