开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情
1.描述
937. 重新排列日志文件 - 力扣(LeetCode) (leetcode-cn.com)
给你一个日志数组 logs
。每条日志都是以空格分隔的字串,其第一个字为字母与数字混合的 标识符 。
有两种不同类型的日志:
- 字母日志:除标识符之外,所有字均由小写字母组成
- 数字日志:除标识符之外,所有字均由数字组成
请按下述规则将日志重新排序:
- 所有 字母日志 都排在 数字日志 之前。
- 字母日志 在内容不同时,忽略标识符后,按内容字母顺序排序;在内容相同时,按标识符排序。
- 数字日志 应该保留原来的相对顺序。
返回日志的最终顺序。
示例 1:
输入:logs = ["dig1 8 1 5 1","let1 art can","dig2 3 6","let2 own kit dig","let3 art zero"]
输出:["let1 art can","let3 art zero","let2 own kit dig","dig1 8 1 5 1","dig2 3 6"]
解释:
字母日志的内容都不同,所以顺序为 "art can", "art zero", "own kit dig" 。
数字日志保留原来的相对顺序 "dig1 8 1 5 1", "dig2 3 6" 。
示例 2:
输入: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 <= logs.length <= 100
- 3 <= logs[i].length <= 100
- logs[i] 中,字与字之间都用 单个 空格分隔
- 题目数据保证 logs[i] 都有一个标识符,并且在标识符之后至少存在一个字
2.分析
将logs range拿到的各项按照字母和数字日志进行分类
将字母日志分为a切片,数字为b切片
然后开始将a进行排序,我用的是类似与冒泡的方法,(这算是最耗时的了)
pan(a,b)这个函数,是判断前者是否需要与后者交换位置,false则需要交换
pan(a,b)实现,主要先拿到第一个‘ ’的位置,然后在进行判断向后判断字符的大小,这里需要注意
3.AC代码
func reorderLogFiles(logs []string) []string {
var a = make([]string, 0)
var b = make([]string, 0)
for _, v := range logs {
if v[len(v)-1] >= 48 && v[len(v)-1] <= 57 { //说明为数字日志
b = append(b, v)
} else {
a = append(a, v)
}
}
//在将a进行排序
for i := 0; i < len(a)-1; i++ { //第一位 和后一直到最后
for j := i + 1; j < len(a); j++ {
isok := pan(a[i], a[j])
if isok == false {
t := a[i]
a[i] = a[j]
a[j] = t
}
}
}
for _, v := range b {
a = append(a, v)
}
return a
}
//false 代表前者大 ,true代表后者大不需要变
func pan(a, b string) bool {
var m, n, z int
for i := 1; i < len(a); i++ {
if a[i] == ' ' {
m = i
z = i
break
}
}
for j := 1; j < len(b); j++ {
if b[j] == ' ' {
n = j
break
}
}
//拿到二者
//比较 二者哪个大
for m < len(a) && n < len(b) {
if a[m] > b[n] {
//说明前者的字符大
return false
} else if a[m] < b[n] {
return true
} else {
m++
n++
}
}
//考虑下特殊情况 例如 a为"a01 asd sdf dfg" b为"b1 asd sdf dfg" 此时后者字符少排在前面
if m == len(a) && n == len(b) {
if m > n {
return false
}
if m == n {
//判断其
for z1 := 0; z1 < z; z1++ {
if a[z1] > b[z1] {
return false
} else {
return true
}
}
}
return true
}
return true
}