- 937.重新排列日志文件
- 题解
- 代码
937.重新排列日志文件
题解题目:简单题
1.如果字符串第二部分是数字,则排最终结果的最后
2.如果两个字符串第二部分都是数字,则保持相对稳定
3.如果字符串第二部分是字母,则字母排前面
3.如果两个字符串第二部分都是字母,则第二部分按字典序排
3.如果第二部分也相等,按第一部分字典序排
思路:内置排序写less,或者模拟。简单题没什么难度,主要是学到了新的函数
介绍:
sort.Slice()//相同元素时不保证稳定
sort.SliceStable()//相同元素时保证稳定
strings.SplitN(logs[i], " ", 2)//字符串最多被分为N份,这里是2
比如“a b c d e”------>["a","b c d e"]
代码
func reorderLogFiles(logs []string) []string {
sort.SliceStable(logs, func(i, j int) bool {
cnt1 := strings.SplitN(logs[i], " ", 2)
a1, a2 := cnt1[0], cnt1[1]
cnt2 := strings.SplitN(logs[j], " ", 2)
b1, b2 := cnt2[0], cnt2[1]
aIsDig, bIsDig := unicode.IsDigit(rune(a2[0])), unicode.IsDigit(rune(b2[0]))
if aIsDig && bIsDig { //都是数字,则不交换,返回false
return false
}
if !aIsDig && !bIsDig { //都是字母,按照题目要求来
return a2 < b2 || a2 == b2 && a1 < b1
}
return !aIsDig //如果a是字母,则不用交换, 如果a是数字,需要交换
})
return logs
}
func reorderLogFiles(logs []string) []string {
ans1 := make([]string, 0)
ans2 := make([]string, 0)
arr := make([]string, 0)
mp := make(map[string][]string)
for _, log := range logs {
n := len(log) - 1
if log[n] >= '0' && log[n] <= '9' {
ans2 = append(ans2, log)
continue
}
cnt := strings.SplitN(log, " ", 2)
logFst, logSec := cnt[0], cnt[1]
mp[logSec] = append(mp[logSec], logFst)
}
for k := range mp {
arr = append(arr, k)
}
sort.Strings(arr)
for _, v := range arr {
vv := mp[v]
sort.Strings(vv)
for _, vvv := range vv {
cnt := vvv + " " + v
ans1 = append(ans1, cnt)
}
}
return append(ans1, ans2...)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)