LeetCode 937. 重新排列日志文件

34 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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
}