zoukankan      html  css  js  c++  java
  • 0949. Largest Time for Given Digits (E)

    Largest Time for Given Digits (E)

    题目

    Given an array of 4 digits, return the largest 24 hour time that can be made.

    The smallest 24 hour time is 00:00, and the largest is 23:59. Starting from 00:00, a time is larger if more time has elapsed since midnight.

    Return the answer as a string of length 5. If no valid time can be made, return an empty string.

    Example 1:

    Input: [1,2,3,4]
    Output: "23:41"
    

    Example 2:

    Input: [5,5,5,5]
    Output: ""
    

    Note:

    1. A.length == 4
    2. 0 <= A[i] <= 9

    题意

    用给定的4个数字组成最大的24时制的时间。

    思路

    可以直接回溯法解决。每一位上都有一个值的范围,从最大值往前遍历寻找可能的组合。

    或者直接对小时23-0和对分钟59-0进行二重循环遍历。


    代码实现

    Java

    回溯法

    class Solution {
        public String largestTimeFromDigits(int[] A) {
            int[] digits = new int[10];
            for (int num : A) {
                digits[num]++;
            }
            return generate(digits, 0, "");
        }
    
        private String generate(int[] digits, int index, String s) {
            if (index == 5) {
                return s;
            }
    
            if (index == 2) {
                return generate(digits, index + 1, s + ":");
            }
    
            int max = index == 0 ? 2 : index == 1 ? (s.charAt(0) == '2' ? 3 : 9) : index == 3 ? 5 : 9;
            for (int i = max; i >= 0; i--) {
                if (digits[i] > 0) {
                    digits[i]--;
                    String t = generate(digits, index + 1, s + i);
                    if (!t.isEmpty()) {
                        return t;
                    } else {
                        digits[i]++;
                    }
                }
            }
    
            return "";
        }
    }
    

    二重循环

    class Solution {
        public String largestTimeFromDigits(int[] A) {
            Arrays.sort(A);
            
            for (int i = 23; i >= 0; i--) {
                for (int j = 59; j >= 0; j--) {
                    int a = i < 10 ? 0 : i / 10;
                    int b = i % 10;
                    int c = j < 10 ? 0 : j / 10;
                    int d = j % 10;
                    int[] B = { a, b, c, d };
                    Arrays.sort(B);
                    boolean valid = true;
                    for (int k = 0; k < 4; k++) {
                        if (A[k] != B[k]) {
                            valid = false;
                            break;
                        }
                    }
                    if (valid) {
                        return "" + a + b + ":" + c + d;
                    }
                }
            }
    
            return "";
        }
    }
    
  • 相关阅读:
    设计模式7—装饰者模式【结构型】
    设计模式6—命令模式【行为型】
    vue工程类型—vue 多模块、vue多项目集成工程
    设计模式5—迭代器模式【行为型】
    设计模式4—代理模式【结构型】
    设计模式3—策略模式【行为型】
    用户权限管理系统(后台权限管理)
    https原理 及 证书
    设计模式2—单例模式【创建型】
    设计模式1—发布订阅者模式【行为型】
  • 原文地址:https://www.cnblogs.com/mapoos/p/13600025.html
Copyright © 2011-2022 走看看