题目

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:

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

Example 2:

  1. Input: [5,5,5,5]
  2. Output: ""

Note:

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

题意

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

思路

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

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


代码实现

Java

回溯法

  1. class Solution {
  2. public String largestTimeFromDigits(int[] A) {
  3. int[] digits = new int[10];
  4. for (int num : A) {
  5. digits[num]++;
  6. }
  7. return generate(digits, 0, "");
  8. }
  9. private String generate(int[] digits, int index, String s) {
  10. if (index == 5) {
  11. return s;
  12. }
  13. if (index == 2) {
  14. return generate(digits, index + 1, s + ":");
  15. }
  16. int max = index == 0 ? 2 : index == 1 ? (s.charAt(0) == '2' ? 3 : 9) : index == 3 ? 5 : 9;
  17. for (int i = max; i >= 0; i--) {
  18. if (digits[i] > 0) {
  19. digits[i]--;
  20. String t = generate(digits, index + 1, s + i);
  21. if (!t.isEmpty()) {
  22. return t;
  23. } else {
  24. digits[i]++;
  25. }
  26. }
  27. }
  28. return "";
  29. }
  30. }

二重循环

  1. class Solution {
  2. public String largestTimeFromDigits(int[] A) {
  3. Arrays.sort(A);
  4. for (int i = 23; i >= 0; i--) {
  5. for (int j = 59; j >= 0; j--) {
  6. int a = i < 10 ? 0 : i / 10;
  7. int b = i % 10;
  8. int c = j < 10 ? 0 : j / 10;
  9. int d = j % 10;
  10. int[] B = { a, b, c, d };
  11. Arrays.sort(B);
  12. boolean valid = true;
  13. for (int k = 0; k < 4; k++) {
  14. if (A[k] != B[k]) {
  15. valid = false;
  16. break;
  17. }
  18. }
  19. if (valid) {
  20. return "" + a + b + ":" + c + d;
  21. }
  22. }
  23. }
  24. return "";
  25. }
  26. }