golang力扣leetcode 937.重新排列日志文件

golang力扣leetcode 937.重新排列日志文件,第1张

937.重新排列日志文件
  • 937.重新排列日志文件
  • 题解
  • 代码

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/800789.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-07
下一篇 2022-05-07

发表评论

登录后才能评论

评论列表(0条)

保存