zoukankan      html  css  js  c++  java
  • [Swift]LeetCode949. 给定数字能组成的最大时间 | Largest Time for Given Digits

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10052893.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    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 小时制的最大时间。

    最小的 24 小时制时间是 00:00,而最大的是 23:59。从 00:00 (午夜)开始算起,过得越久,时间越大。

    以长度为 5 的字符串返回答案。如果不能确定有效时间,则返回空字符串。

    示例 1:

    输入:[1,2,3,4]
    输出:"23:41"
    

    示例 2:

    输入:[5,5,5,5]
    输出:""

    提示:

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

    12ms
     1 class Solution {
     2     func largestTimeFromDigits(_ A: [Int]) -> String {
     3         let a = [
     4             [0, 1, 2, 3],
     5             [0, 1, 3, 2],
     6             [1, 0, 2, 3],
     7             [1, 0, 3, 2],
     8             [0, 2, 1, 3],
     9             [0, 2, 3, 1],
    10             [2, 0, 1, 3],
    11             [2, 0, 3, 1],
    12             [0, 3, 1, 2],
    13             [0, 3, 2, 1],
    14             [3, 0, 1, 2],
    15             [3, 0, 2, 1],
    16             [1, 2, 0, 3],
    17             [1, 2, 3, 0],
    18             [2, 1, 0, 3],
    19             [2, 1, 3, 0],
    20             [1, 3, 0, 2],
    21             [1, 3, 2, 0],
    22             [3, 1, 0, 2],
    23             [3, 1, 2, 0],
    24             [2, 3, 0, 1],
    25             [2, 3, 1, 0],
    26             [3, 2, 0, 1],
    27             [3, 2, 1, 0]
    28         ].compactMap { r -> String? in
    29             let a = A[r[0]]
    30             let b = A[r[1]]
    31             let c = A[r[2]]
    32             let d = A[r[3]]
    33             
    34             let f1 = a * 10 + b
    35             let f2 = c * 10 + d
    36             
    37             if f1 < 24 && f2 < 60 {
    38                 return "(a)(b):(c)(d)"
    39             } else {
    40                 return nil
    41             }
    42         }
    43 
    44         
    45         return a.max() ?? ""
    46     }
    47 }

    16ms
     1 class Solution {
     2     func largestTimeFromDigits(_ A: [Int]) -> String {
     3        var ans = -1
     4         
     5         // Choose different indices i, j, k, l as a permutation of 0, 1, 2, 3
     6         for i in 0..<4 {
     7             for j in 0..<4 {
     8                 if j != i {
     9                     for k in 0..<4 {
    10                         if k != i && k != j {
    11                             let l = 6 - i - j - k
    12                             let hour = 10 * A[i] + A[j]
    13                             let min = 10 * A[k] + A[l]
    14                             if hour < 24 && min < 60 {
    15                                 ans = max(ans, hour * 60 + min)
    16                             }
    17                         }
    18                     }
    19                 }
    20             }
    21         }
    22        
    23         return  ans >= 0 ? String.init(format: "%02d:%02d", ans / 60, ans % 60) : ""
    24     }
    25 }

    24ms

     1 class Solution {
     2     var result = -1
     3     func largestTimeFromDigits(_ A: [Int]) -> String {
     4         var isVisited = [Bool](repeating: false, count: 4)
     5         var value = 0
     6         dfs(A, &value, &isVisited)
     7         return result == -1 ? "" : convertResultToString(result)
     8     }
     9     
    10     func dfs(_ A: [Int], _ value: inout Int, _ isVisited: inout [Bool]) {
    11     
    12         if (isVisited.filter { $0 == true }.count == 4) {
    13             if isValidTime(value)  {
    14                 result = max(result, value)
    15             }
    16             return 
    17         }
    18         
    19 
    20         for i in 0..<A.count {
    21             guard !isVisited[i] else {
    22                 continue
    23             }
    24             
    25             value = value * 10 + A[i]
    26             isVisited[i] = true
    27             dfs(A, &value, &isVisited)
    28             isVisited[i] = false
    29             value = value / 10
    30         }
    31     } 
    32     func isValidTime(_ input: Int) -> Bool {
    33         var input = input
    34         guard input <= 2359 else {
    35             return false
    36         }
    37         
    38         guard input % 100 <= 59 else {
    39             return false
    40         }
    41         return true
    42     }
    43     
    44     func convertResultToString(_ input: Int) -> String {
    45         var input = input
    46         var convertedString = ""
    47         for i in 0...3 {
    48             if i == 2 {
    49                 convertedString = ":" + convertedString
    50             }
    51             convertedString = String(input % 10) + convertedString
    52             input = input / 10
    53         }
    54         return convertedString
    55     }
    56 }

    28ms

     1 class Solution {
     2     func largestTimeFromDigits(_ A: [Int]) -> String {
     3     
     4     // 1) Permutate digits and get largest valid time
     5     var answer = permuteDigitsToStrings(A, "", "-1")
     6     
     7     // 2) Convert to time format
     8     if answer == "-1" {
     9         return ""
    10     }
    11     
    12     answer.insert(":", at: answer.index(answer.startIndex, offsetBy: 2))
    13     return answer
    14 }
    15 
    16 func permuteDigitsToStrings(_ A: [Int], _ currentDigits: String, _ max: String) -> String {
    17     
    18     var currMax = max
    19     guard A.count > 0 else {
    20         currMax = max
    21         if validateTime(currentDigits) && Int(max)! < Int(currentDigits)! {
    22             currMax = currentDigits
    23         }
    24         return currMax
    25     }
    26     
    27     // Permutate
    28     for num in A {
    29         var remaining = A
    30         // Choose
    31         let digit = remaining.remove(at: remaining.firstIndex(of: num)!)
    32         let curDigits = currentDigits + String(digit)
    33         
    34         // Explore
    35         currMax = permuteDigitsToStrings(remaining, curDigits, currMax)
    36         
    37     }
    38     
    39     return currMax
    40 }
    41 
    42 func validateTime(_ digits: String) -> Bool {
    43     // Validate hours and minutes
    44     let minuteStartIndex = digits.index(digits.startIndex, offsetBy: 2)
    45     let minuteEndIndex = digits.index(digits.startIndex, offsetBy: 3)
    46     guard
    47         let hour = Int(String(digits[digits.startIndex...digits.index(digits.startIndex, offsetBy: 1)])),
    48         let min = Int(String(digits[minuteStartIndex...minuteEndIndex]))
    49         else { return false }
    50     
    51     if hour >= 24 || min >= 60 {
    52         return false
    53     }
    54     
    55     return true
    56 }
    57 }

    48ms

     1 class Solution {
     2     func permute<C: Collection>(items: C) -> [[C.Iterator.Element]] {
     3     var scratch = Array(items) // This is a scratch space for Heap's algorithm
     4     var result: [[C.Iterator.Element]] = [] // This will accumulate our result
     5 
     6     // Heap's algorithm
     7     func heap(_ n: Int) {
     8         if n == 1 {
     9             result.append(scratch)
    10             return
    11         }
    12 
    13         for i in 0..<n-1 {
    14             heap(n-1)
    15             let j = (n%2 == 1) ? 0 : i
    16             scratch.swapAt(j, n-1)
    17         }
    18         heap(n-1)
    19     }
    20 
    21     // Let's get started
    22     heap(scratch.count)
    23 
    24     // And return the result we built up
    25     return result
    26 }
    27 
    28 func v(c: Character, i : Int) -> Bool {
    29     return Int(String(c))! <= i
    30 }
    31 
    32 func largestTimeFromDigits(_ A: [Int]) -> String {
    33 
    34    var options: [[Int]] = []
    35 
    36     options = permute(items: A)
    37 
    38 
    39     let nums = options.compactMap({String("($0[0])($0[1])($0[2])($0[3])")})
    40 
    41     let num = nums.compactMap({Int($0)})
    42 
    43 
    44     var valid: [String] = []
    45 
    46     var max = -1
    47     for n in nums {
    48 
    49         let itms = Array(n)
    50 
    51         let s = String("(itms[0])(itms[1])")
    52         let it = Int(s)!
    53 
    54         if it >= 24 {
    55             continue
    56         } else {
    57 
    58             let oth = Int(String("(itms[2])(itms[3])"))!
    59 
    60             if oth >= 60 {
    61                 continue
    62             } else {
    63                 valid.append(n)
    64             }
    65 
    66         }
    67 
    68     }
    69 
    70     if valid.count == 0 {
    71         return ""
    72     }
    73 
    74     let ss = valid.sorted(by: { (s1, s2) -> Bool in
    75         s1 > s2
    76     }).first!
    77 
    78     let ssa = Array(ss)
    79 
    80     return String("(ssa[0])(ssa[1]):(ssa[2])(ssa[3])")
    81 
    82 
    83 
    84     return ""
    85 
    86 }
    87 
    88 }

    96ms 
     1 class Solution {
     2     func largestTimeFromDigits(_ A: [Int]) -> String {
     3         var f:[Int] = [Int](repeating:0,count:10)
     4         for x in A
     5         {
     6             f[x] += 1
     7         }
     8         for h in (0...23).reversed()
     9         {
    10             for m in (0...59).reversed()
    11             {
    12                 var g:[Int] = [Int](repeating:0,count:10)
    13                 var i:Int = h
    14                 for j in 0..<2
    15                 {
    16                     g[i%10] += 1
    17                     i /= 10
    18                 }
    19                 i = m
    20                 for j in 0..<2
    21                 {
    22                     g[i%10] += 1
    23                     i /= 10
    24                 }
    25                 if f == g
    26                 {
    27                     return String(format:"%02d:%02d", h, m)
    28                 }
    29             }
    30         }
    31         return String()
    32     }
    33 }

    180ms 
     1 class Solution {
     2     func largestTimeFromDigits(_ A: [Int]) -> String {
     3         var sortA = A.sorted()
     4         
     5         var time: [Int] = [2, 3, 5, 9]
     6         
     7         
     8         while true {
     9             if sortA == time.sorted() {
    10                 return "(time[0])(time[1]):(time[2])(time[3])"
    11             }
    12            
    13             if time[3] > 0 {
    14                 time[3] -= 1
    15             } else if time[2] > 0 {
    16                  time[2] -= 1
    17                  time[3] = 9
    18             } else if time[1] > 0 {
    19                 time[1] -= 1
    20                 time[3] = 9
    21                 time[2] = 5
    22             } else if time[0] > 0 {
    23                 time[0] -= 1
    24                 time[1] = 9
    25                 time[3] = 9
    26                 time[2] = 5
    27             } else {
    28                 return ""
    29             }
    30          }
    31         
    32         return ""
    33     }
    34 }
  • 相关阅读:
    Sql server时间转时间long
    SQL Server死锁问题:事务(进程 ID x)与另一个进程被死锁在 锁 | 通信缓冲区资源上并且已被选作死锁牺牲品。请重新运行该事务。
    layui jquery ajax,url,type,async,dataType,data
    在 Postman 中报错:Self-signed SSL certificates are being blocked 的分析与解决
    SQL server CASE WHEN
    SQL server 统计分组经计
    Spring boot @Transactional
    基于mysql的sakila数据库脚本分析
    常用数据库JDBC
    在做银行支付接口案例的时候,遇到的编码问题!
  • 原文地址:https://www.cnblogs.com/strengthen/p/10052893.html
Copyright © 2011-2022 走看看