博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Swift]LeetCode937. 重新排列日志文件 | Reorder Log Files
阅读量:4670 次
发布时间:2019-06-09

本文共 11877 字,大约阅读时间需要 39 分钟。

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

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

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 = 010                 let length = log.count11                 for char in log {12                     if char == " " {13                         let suffix = String(log.suffix(length-index-1))14                         letterDic[suffix] = log15                         keys.append(suffix)16                         break17                     }18                     index += 119                 }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+digitLogs29     }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 = orig10             11             let index = orig.firstIndex(of: " ")!12             self.identifier = String(orig[orig.startIndex..
[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.identifier26 } else {27 return $0.content < $1.content28 }29 }30 31 return [letters, digits].flatMap { arr in32 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.013         }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 } + digits21     }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 in23                 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 in19             if first.value.word == second.value.word{20                 return first.value.identifier < second.value.identifier21             }else{22                 return first.value.word < second.value.word23             }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 result34         35     }36     37     private func dissectAlphaLog(_ s : String)->(identifier : String, word : String){38         var str = Array(s)39         var movingIndex : Int = 040         var identifier : String = ""41         var word : String = ""42         while movingIndex < str.count{43             if str[movingIndex] != " "{44                 movingIndex += 145             }else{46                 identifier = String(str[0..
Bool{57 var movingIndex : Int = 058 var str = Array(s)59 var char : Character = Character.init("a")60 while movingIndex < str.count {61 if str[movingIndex] != " "{62 movingIndex += 163 }else{64 char = str[movingIndex + 1]65 break66 }67 }68 69 let letterSet = CharacterSet.letters70 if letterSet.contains(char.unicodeScalars.first!){71 return false72 }else{73 return true74 }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..
Bool25 {26 //'0':ASCII码值 48; '9'ASCII码值 5727 var num1:Int = a[0].toInt(0)28 var ad:Bool = num1 >= 48 && num1 <= 5729 30 var num2:Int = b[0].toInt(0)31 var bd:Bool = num2 >= 48 && num2 <= 5732 33 if !ad && bd{
return true}34 if ad && !bd{
return false}35 var str1:String36 var str2:String37 if !ad && !bd38 {39 if a[0] != b[0]40 {41 str1 = a[0]42 str2 = b[0]43 }44 else45 {46 str1 = a[1]47 str2 = b[1]48 }49 }50 else51 {52 str1 = a[3]53 str2 = b[3]54 }55 let num = str1.caseInsensitiveCompare(str2).rawValue56 if num == -157 {58 return true59 }60 return false61 }62 }63 64 extension String {65 //获取指定索引位置的字符,返回为字符串形式66 func charAt(_ num:Int) -> String67 {68 return String(self[index(self.startIndex,offsetBy: num)]) 69 }70 71 //获取指定索引位置字符的ASCII整数值72 func toInt(_ num:Int) -> Int73 {74 let s = charAt(num).unicodeScalars75 return Int(s[s.startIndex].value) 76 }77 }

 124ms

1 extension Array { 2     mutating func stableSort(by areInIncreasingOrder: (Array
.Element, Array
.Element) -> Bool) { 3 for startIdx in startIndex..
[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 + digiLogs27 }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 < lb15     }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) + dig20     }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 in12             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

 

转载于:https://www.cnblogs.com/strengthen/p/9942450.html

你可能感兴趣的文章
services 系统服务的启动、停止、卸载
查看>>
Fiddler 网页采集抓包利器__手机app抓包
查看>>
Number and String
查看>>
java中的值传递和引用传递2<原文:http://blog.csdn.net/niuniu20008/article/details/2953785>...
查看>>
css实现背景图片模糊
查看>>
什么是runtime?什么是webgl?
查看>>
秋季学习总结
查看>>
categorical_crossentropy VS. sparse_categorical_crossentropy
查看>>
强引用,弱引用,4种Java引用浅解(涉及jvm垃圾回收)
查看>>
多线程如何确定线程数
查看>>
UGUI RectTransform
查看>>
学前班
查看>>
手把手教您扩展虚拟内存
查看>>
android-samples-mvp
查看>>
oracle 11g r2安装
查看>>
关于自关联1
查看>>
存储控制器、MMU、flash控制器介绍
查看>>
hdu-1814(2-sat)
查看>>
自我反省
查看>>
反射,得到Type引用的三种方式
查看>>