每日算法(4):6个数找最大时间

题目

给定一个数组,里面有6个整数,求这个数组能够表示的最大24进制的时间是多少, 输出这个时间,无法表示输出invalid
输入:输入为一个整数数组,数组内有6个整数
       输入整数数组长度为6,不需要考虑其它长度,元素值为0或者正整数,
       6个数字每个数字只能使用一次。
输出:输出为一个24进账格式的时间,或者字符串“invalid”
       示例输入:[0,2,3,0,5,6]
       示例输出: 23:56:00

代码

public class GetMaxDateByArray {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 循环连续读取
        while (sc.hasNext()) {
            String line = sc.nextLine();
            System.out.println(getResult(line));
        }
    }

    /**
     * 解题思路:  时间格式第一位不能大于2,第二位不能大于3等
     * 所以从头开始,一位一位找,先找满足第一位的集合中的数字,然后找出最大的一个,
     * 碰到任何不满足条件的直接返回 invalid,满足则从数组从移除,以此类推
     * 这里注意一点,list.remove 有两个重载方法,如果是int集合,按照元素删除,必须是包装类,即 Integer.valueOf, 否则会按照索引删除,会有问题
     */
    private static String getResult(String line) {
        final String s = "invalid";
        final String c = ":";
        String[] strArray = line.split(",");
        // 转换为数组,放入集合
        List<Integer> list = Arrays.stream(strArray).map(Integer::parseInt).collect(Collectors.toList());
        StringBuilder result = new StringBuilder();
        //第一位不能大于3,获取数组中小于3的数字中最大的一个
        int data1 = getDataOfLocation(list, 3);
        if (data1 != -1) {
            list.remove(Integer.valueOf(data1));
            result.append(data1);
        } else {
            return s;
        }
        //如果第一位是2,那么第二位则不能超过4
        if (result.charAt(0) == '2') {
            //第二位
            int data2 = getDataOfLocation(list, 4);
            if (data2 != -1) {
                // 按照元素删除
                list.remove(Integer.valueOf(data2));
                result.append(data2);
                result.append(c);
            } else {
                return s;
            }
            // 否则,第一位可能是0或者1,这样第二位可以是0-9,即小于10
        } else {
            //第二位
            int data3 = getDataOfLocation(list, 10);
            if (data3 != -1) {
                list.remove(data3);
                result.append(data3);
                result.append(c);
            } else {
                return s;
            }
        }
        //第三位,分钟最大是59,即小于6
        int data4 = getDataOfLocation(list, 6);
        if (data4 != -1) {
            list.remove(Integer.valueOf(data4));
            result.append(data4);
        } else {
            return s;
        }
        //第四位,0-9
        int data5 = getDataOfLocation(list, 10);
        if (data5 != -1) {
            list.remove(Integer.valueOf(data5));
            result.append(data5);
            result.append(c);
        } else {
            return s;
        }
        //第五位
        int data6 = getDataOfLocation(list, 6);
        if (data6 != -1) {
            list.remove(Integer.valueOf(data6));
            result.append(data6);
        } else {
            return s;
        }
        //最后一位
        if (getDataOfLocation(list, 10) != -1) {
            result.append(getDataOfLocation(list, 10));
        } else {
            return s;
        }
        return result.toString();
    }

    /**
     * 获取数组中比 standard 小的数字中最大的一个数,没有返回-1
     */
    static int getDataOfLocation(List<Integer> list, int standard) {
        return list.stream().filter(x -> x < standard).mapToInt(x -> x).max().orElse(-1);
    }
}

posted @ 2020-11-27 17:12  侯小厨  阅读(1999)  评论(0编辑  收藏  举报
Fork me on Gitee