这道题使用的是自定义排序的方法,主要是对字符串进行处理,首先第一个标识符是字母和数字的混合,只有在排序过程中,两个均为字母日志时,且在内容相同时,看标识符的比较,否则比较第二个字符串的字典序,如果都为数字,则保持顺序,如果第一个是字母的,第二个是数字的话,保持顺序,保证字母日志在数字日志之前。
func reorderLogFiles(logs []string) []string {
// 自定义排序
sort.SliceStable(logs, func(i, j int) bool {
s, t := logs[i], logs[j]
// 取出来字符串并且切割,将标识符切掉,
s1 := strings.SplitN(s, " ", 2)[1]
s2 := strings.SplitN(t, " ", 2)[1]
// 然后判断第二个字符串
isDigit1 := unicode.IsDigit(rune(s1[0]))
isDigit2 := unicode.IsDigit(rune(s2[0]))
// 如果二者都为数字,保持原来的顺序
if isDigit1 && isDigit2 {
return false
}
// 如果二者都为字母,则判断字典序,或者在第二个字母相同的情况下,按照正常的标识符排序
if !isDigit1 && !isDigit2 {
return s1 < s2 || s1 == s2 && s < t
}
// 如果第一个是字母的话,返回true,字母排在数字的前面
return !isDigit1
})
return logs
}