每日算法(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);
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM