题解 | 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;
    }
}

大概,就是。。。。。。先把自己实现方式用到的类贴到编码框看看能不能用。不能用的话就要写工具方法,这时候可以考虑代码重用的问题。

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务