zoukankan      html  css  js  c++  java
  • [Swift]LeetCode937. 重新排列日志文件 | Reorder Log Files

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

    You have an array of logs.  Each log is a space delimited string of words.

    For each log, the first word in each log is an alphanumeric identifier.  Then, either:

    • Each word after the identifier will consist only of lowercase letters, or;
    • Each word after the identifier will consist only of digits.

    We will call these two varieties of logs letter-logs and digit-logs.  It is guaranteed that each log has at least one word after its identifier.

    Reorder the logs so that all of the letter-logs come before any digit-log.  The letter-logs are ordered lexicographically ignoring identifier, with the identifier used in case of ties.  The digit-logs should be put in their original order.

    Return the final order of the logs.

    Example 1:

    Input: ["a1 9 2 3 1","g1 act car","zo4 4 7","ab1 off key dog","a8 act zoo"]
    Output: ["g1 act car","a8 act zoo","ab1 off key dog","a1 9 2 3 1","zo4 4 7"]

    Note:

    1. 0 <= logs.length <= 100
    2. 3 <= logs[i].length <= 100
    3. logs[i] is guaranteed to have an identifier, and a word after the identifier.

    你有一个日志数组 logs。每条日志都是以空格分隔的字串。

    对于每条日志,其第一个字为字母数字标识符。然后,要么:

    • 标识符后面的每个字将仅由小写字母组成,或;
    • 标识符后面的每个字将仅由数字组成。

    我们将这两种日志分别称为字母日志和数字日志。保证每个日志在其标识符后面至少有一个字。

    将日志重新排序,使得所有字母日志都排在数字日志之前。字母日志按字母顺序排序,忽略标识符,标识符仅用于表示关系。数字日志应该按原来的顺序排列。

    返回日志的最终顺序。

    示例 :

    输入:["a1 9 2 3 1","g1 act car","zo4 4 7","ab1 off key dog","a8 act zoo"]
    输出:["g1 act car","a8 act zoo","ab1 off key dog","a1 9 2 3 1","zo4 4 7"]

    提示:

    1. 0 <= logs.length <= 100
    2. 3 <= logs[i].length <= 100
    3. logs[i] 保证有一个标识符,并且标识符后面有一个字。

    92ms
     1 class Solution {
     2     func reorderLogFiles(_ logs: [String]) -> [String] {
     3         var digitLogs  = [String]()
     4         var letterLogs = [String]()
     5         var keys = [String]()
     6         var letterDic = [String:String]()
     7         for log in logs {
     8             if log.last! >= "a" && log.last! <= "z" {
     9                 var index = 0
    10                 let length = log.count
    11                 for char in log {
    12                     if char == " " {
    13                         let suffix = String(log.suffix(length-index-1))
    14                         letterDic[suffix] = log
    15                         keys.append(suffix)
    16                         break
    17                     }
    18                     index += 1
    19                 }
    20             }else {
    21                 digitLogs.append(log)
    22             }
    23         }
    24         keys = keys.sorted()
    25         for key in keys {
    26             letterLogs.append(letterDic[key] ?? "")
    27         }
    28         return letterLogs+digitLogs
    29     }
    30 }

    96ms

     1 class Solution {
     2     struct Log {
     3         let identifier: String
     4         let content: String
     5         let orig: String
     6         let isLetter: Bool
     7         
     8         init(_ orig: String) {
     9             self.orig = orig
    10             
    11             let index = orig.firstIndex(of: " ")!
    12             self.identifier = String(orig[orig.startIndex..<index])
    13             self.content = String(orig[orig.index(after:index)...])
    14             self.isLetter = Int(String(self.content.first!)) == nil            
    15         }
    16     }
    17     func reorderLogFiles(_ logs: [String]) -> [String] {
    18         
    19         let logsArr: [Log] = logs.map { Log($0) }
    20         var letters = logsArr.filter { $0.isLetter }
    21         var digits = logsArr.filter { !$0.isLetter }
    22         
    23         letters.sort { 
    24             if $0.content == $1.content {
    25                 return $0.identifier < $1.identifier
    26             } else {
    27                 return $0.content < $1.content
    28             }
    29         }
    30         
    31         return [letters, digits].flatMap { arr in
    32             return arr.map { $0.orig }
    33         }
    34     }
    35 }

    104ms

     1 class Solution {
     2     func reorderLogFiles(_ logs: [String]) -> [String] {
     3         
     4         let letters = logs.filter {
     5             let lastChar = $0.charAt($0.count - 1) 
     6             return CharacterSet.letters.contains(lastChar.unicodeScalars.first!)
     7         }.map { 
     8             $0.split(separator: " ") 
     9         }.map {
    10             (Array($0[1..<$0.count]).joined(separator: " "), $0[0])
    11         }.sorted {
    12             return $0.0 < $1.0
    13         }
    14 
    15         let digits = logs.filter {
    16             let lastChar = $0.charAt($0.count - 1)
    17             return CharacterSet.decimalDigits.contains(lastChar.unicodeScalars.first!)
    18         }
    19         
    20         return letters.map { $0.1 + " " + $0.0 } + digits
    21     }
    22 }
    23 
    24 extension String {
    25     func charAt(_ pos:Int) -> String {
    26         guard pos < self.count else {
    27             assertionFailure("Index out of range!")
    28             return String()
    29         }
    30         let index = self.index(self.startIndex, offsetBy: pos)
    31         return String(self[index])
    32     }
    33 }

    108ms

     1 class Solution {
     2         func reorderLogFiles(_ logs: [String]) -> [String] {
     3             var letters = [String]();
     4             var digits = [String]();
     5             var output = [String]();
     6             for log in logs{
     7                 let elements = log.split(separator: " ");
     8                 let firstElement = elements[1];
     9                 var isLetter = false;
    10                 for char in firstElement.utf8{
    11                     if (char >= "a".utf8.first! && char <= "z".utf8.first!){
    12                         isLetter = true;
    13                         break;
    14                     }
    15                 }
    16                 if isLetter{
    17                     letters.append(log);
    18                 }else{
    19                     digits.append(log);
    20                 }
    21             }
    22             letters.sort(by: {(a:String,b:String)->Bool in
    23                 var index = a.firstIndex(of: " ");
    24                 index = a.index(index!, offsetBy: 1)
    25                 let suffixA = a.suffix(from: index!)
    26                 index = b.firstIndex(of: " ")
    27                 index = b.index(index!, offsetBy: 1)
    28                 let suffixB = b.suffix(from: index!)
    29                 return suffixA < suffixB;
    30             })
    31             for str in letters{
    32                 output.append(str)
    33             }
    34             for str in digits{
    35                 output.append(str)
    36             }
    37             return output;
    38         }
    39     }

    112ms

     1 class Solution {
     2     func reorderLogFiles(_ logs: [String]) -> [String] {
     3         guard logs.count > 0 else {
     4             return []
     5         }
     6         var result : [String] = []
     7         var alphaLogDictionary : [String : (identifier : String, word : String)] = [:]
     8         var digitLogArray : [String] = []
     9 
    10         for log in logs{
    11             if isDigitLog(log){
    12                 digitLogArray.append(log)
    13             }else{
    14                 alphaLogDictionary[log] = dissectAlphaLog(log)
    15             }
    16         }
    17         
    18         let sortedAlpha = alphaLogDictionary.sorted { (first, second) -> Bool in
    19             if first.value.word == second.value.word{
    20                 return first.value.identifier < second.value.identifier
    21             }else{
    22                 return first.value.word < second.value.word
    23             }
    24         }
    25         
    26         for pair in sortedAlpha{
    27             result.append(pair.key)
    28         }
    29         for value in digitLogArray{
    30             result.append(value)
    31         }
    32         
    33         return result
    34         
    35     }
    36     
    37     private func dissectAlphaLog(_ s : String)->(identifier : String, word : String){
    38         var str = Array(s)
    39         var movingIndex : Int = 0
    40         var identifier : String = ""
    41         var word : String = ""
    42         while movingIndex < str.count{
    43             if str[movingIndex] != " "{
    44                 movingIndex += 1
    45             }else{
    46                 identifier = String(str[0..<movingIndex])
    47                 word = String(str[movingIndex..<str.count])
    48                 return (identifier : identifier, word : word)
    49             }
    50         }
    51         
    52         return (identifier : "", word : "")
    53         
    54     }
    55     
    56     private func isDigitLog(_ s : String)->Bool{
    57         var movingIndex : Int = 0
    58         var str = Array(s)
    59         var char : Character = Character.init("a")
    60         while movingIndex < str.count {
    61             if str[movingIndex] != " "{
    62                 movingIndex += 1
    63             }else{
    64                 char = str[movingIndex + 1]
    65                 break
    66             }
    67         }
    68         
    69         let letterSet = CharacterSet.letters
    70         if letterSet.contains(char.unicodeScalars.first!){
    71             return false
    72         }else{
    73             return true
    74         }
    75     }
    76 }

    120ms

     1 class Solution {
     2     func reorderLogFiles(_ logs: [String]) -> [String] {
     3         var n:Int = logs.count
     4         var ss:[[String]] = [[String]](repeating: [String](), count: n)
     5         for i in 0..<n
     6         {
     7             let str:String = logs[i]
     8             var end = str.firstIndex(of: " ") ?? str.endIndex
     9             //不包括结束索引
    10             var id:String = String(str[str.startIndex..<end])
    11             let start = end == str.endIndex ? str.endIndex : str.index(end, offsetBy: 1)
    12             var rem:String = String(str[start..<str.endIndex])
    13             ss[i] = [rem, id, str, String(format: "%05d",i)]
    14         }
    15         ss.sort(by: compare)
    16         var ret:[String] = [String] (repeating:String(),count: n)
    17         for i in 0..<n
    18         {
    19             ret[i] = ss[i][2]
    20         }
    21         return ret
    22     }
    23     
    24     func compare(_ a:[String],_ b:[String]) -> Bool
    25     {
    26         //'0':ASCII码值 48; '9'ASCII码值 57
    27         var num1:Int = a[0].toInt(0)
    28         var ad:Bool = num1 >= 48 && num1 <= 57
    29         
    30         var num2:Int = b[0].toInt(0)
    31         var bd:Bool = num2 >= 48 && num2 <= 57
    32         
    33         if !ad && bd{return true}
    34         if ad && !bd{return false}
    35         var str1:String
    36         var str2:String
    37         if !ad && !bd
    38         {
    39             if a[0] != b[0]
    40             {
    41                 str1 = a[0]
    42                 str2 = b[0]
    43             }
    44             else
    45             {
    46                 str1 = a[1]
    47                 str2 = b[1]
    48             }
    49         }
    50         else
    51         {
    52             str1 = a[3]
    53             str2 = b[3]
    54         }
    55         let num = str1.caseInsensitiveCompare(str2).rawValue
    56         if num == -1
    57         {
    58             return true
    59         }
    60         return false
    61     }
    62 }
    63 
    64 extension String {
    65     //获取指定索引位置的字符,返回为字符串形式
    66     func charAt(_ num:Int) -> String
    67     {
    68         return String(self[index(self.startIndex,offsetBy: num)]) 
    69     }
    70     
    71     //获取指定索引位置字符的ASCII整数值
    72     func toInt(_ num:Int) -> Int
    73     {
    74         let s = charAt(num).unicodeScalars
    75         return Int(s[s.startIndex].value) 
    76     }
    77 }

     124ms

     1 extension Array {
     2     mutating func stableSort(by areInIncreasingOrder: (Array<Element>.Element, Array<Element>.Element) -> Bool) {
     3         for startIdx in startIndex..<endIndex {
     4             for targetIdx in index(after:startIdx)..<endIndex {
     5                 if !areInIncreasingOrder(self[startIdx], self[targetIdx]) {
     6                     let tmp = self[startIdx]
     7                     self[startIdx] = self[targetIdx]
     8                     self[targetIdx] = tmp
     9                 }
    10             }
    11         }
    12     }
    13 }
    14 
    15 extension String {
    16     var cdr:Substring? {
    17         return split(separator: " ", maxSplits: 1).last 
    18     }
    19 }
    20 class Solution {
    21     func reorderLogFiles(_ logs: [String]) -> [String] {
    22         let digiLogs = logs.filter{Int($0[$0.index(before:$0.endIndex)..<$0.endIndex]) != nil}
    23         var letterLogs = logs.filter{Int($0[$0.index(before:$0.endIndex)..<$0.endIndex]) == nil}
    24         letterLogs.sort()
    25         letterLogs.stableSort{String($0.cdr!) < String($1.cdr!)}
    26         return letterLogs + digiLogs
    27     }
    28 }

    132ms

     1 class Solution {
     2     func getLogStr(_ s: String) -> Substring {
     3       return s.suffix(from: s.index(after: s.firstIndex(of: " ")!))
     4     }
     5     func isDig(_ s: String) -> Bool {
     6       let digits = Character("0")...Character("9")
     7       let l = getLogStr(s)
     8       return digits.contains(l[l.startIndex])
     9     }
    10     func cmp(_ a: String, _ b: String) -> Bool {
    11       let la = getLogStr(a)
    12       let lb = getLogStr(b)
    13       if la == lb { return a < b }
    14       return la < lb
    15     }
    16     func reorderLogFiles(_ logs: [String]) -> [String] {
    17       let dig = logs.filter(isDig)
    18       let alp = logs.filter{!isDig($0)}
    19       return alp.sorted(by: cmp) + dig
    20     }
    21 }

    140ms

     1 class Solution {
     2     func reorderLogFiles(_ logs: [String]) -> [String] {
     3              let one = logs.filter { (str) -> Bool in
     4             Int(String(String(str.split(separator: " ")[1]).first!)) != nil
     5         }
     6         
     7         var two = logs.filter { (str) -> Bool in
     8             Int(String(String(str.split(separator: " ")[1]).first!)) == nil
     9         }
    10         
    11         two.sort { (a, b) -> Bool in
    12             let arrayOne = a.split(separator: " ")
    13             let arrayTwo = b.split(separator: " ")
    14             let str_one = String(arrayOne[1...].joined(separator: " "))
    15             let str_two = String(arrayTwo[1...].joined(separator: " "))
    16             return str_one<str_two
    17         }
    18         
    19         return two + one
    20     }
    21 }
  • 相关阅读:
    什么是跨域
    w3c标准
    什么是域名?什么网站名?什么是URL?
    meta是什么意思?
    什么是HTML、XML和XHTML
    html4.0.1,h5,xhml,文档声明区别
    checkbox 点击全选
    【今日CV 计算机视觉论文速览】Fri, 22 Mar 2019
    【机器翻译】API接口总结
    【今日CV 计算机视觉论文速览】Fri, 22 Mar 2019
  • 原文地址:https://www.cnblogs.com/strengthen/p/9942450.html
Copyright © 2011-2022 走看看