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...) }