【刷题日记】824. 山羊拉丁文
本次刷题日记的第 40 篇,力扣题为:【刷题日记】824. 山羊拉丁文 ,简单
一、题目描述:
山羊拉丁文,看上去应该是一个简单拼接字符串的题目,那么为啥要叫山羊拉丁文呢?是一种语言吗?会有人群使用这种语言? 不得而知
二、这道题考察了什么思想?你的思路是什么?
不管怎么样,我们以解题,锻炼自己思维为目的,一起来看看这个题都给我们说了些啥?
- 题目中给出的一个句子,空格分隔,有的是元音开头,有的不是
- 我们需要将给出的句子转换成山羊拉丁文,处理的方式,遇到元音,直接在元音后面加 ma,然后根据空格的个数再后面加多个 a
- 遇到非元音,需要将头的字母移动到最后,并加上 ma,然后根据空格的个数再后面加多个 a
例如效果是这个样子的
例如遇到 over ,
- 如果 over 是第一个单词,因为 o 是元音,那么需要转成 overmaa
- 如果是 over 是第二个单词,那么需要转成 overmaaa
如果遇到 Latin,
- 如果 Latin 是第一个单词,因为 L 不是元音,则 L 需要移动到最后,atinLmaa
- 如果 Latin 是第二个单词,因为 L 不是元音,则 L 需要移动到最后,atinLmaaa
根据这 2 个简单实例,应该就能清楚的明白,其实我们就是在做一个字符串拼接的题目,那么处理的思路可以是
- 遍历题目中给出的字符串,遇到空格说明已经遍历了一个单词,对这个单词进行处理,如果是元音,按照元音的处理方式处理,反之亦然
- 最后将所有单词一个一个的拼接起来,就可以得到结果了
现在我们来实现咱们的思路吧
三、编码
现在来开始实现我们的编码,这里需要注意几点
- 需要分清楚元音和非元音的字符串处理,不要搞混
- 需要记得在结果字符串中也要加上空格
- 根据空格的个数加上 a 字符
var vowels = map[byte]struct{}{'a': {}, 'e': {}, 'i': {}, 'o': {}, 'u': {}, 'A': {}, 'E': {}, 'I': {}, 'O': {}, 'U': {}} func toGoatLatin(sentence string) string { ans := &strings.Builder{} cnt := 1 n := len(sentence) // 开始遍历字符串 for i :=0; i < n; i++ { if cnt > 1 { ans.WriteByte(' ') } start := i // 遍历寻找空格 for i++; i < n && sentence[i] != ' '; i++ {} cnt++ if _, ok := vowels[sentence[start]]; ok { ans.WriteString(sentence[start:i]) } else { ans.WriteString(sentence[start+1 : i]) ans.WriteByte(sentence[start]) } // 拼接 m ans.WriteByte('m') // 拼接 a ,然后根据空格再拼接a,例如现在识别到 1 个空格,那么要加 1 个 ma 的 a,并且要加上 1 个 a // 如果是识别到第 2 个空格,那么要加上 1 个 ma 的 a,且加上 2 个 a ans.WriteString(strings.Repeat("a", cnt)) } // 将 byte 转成 string return ans.String() }
本次编码我们可以看到定义了一个 map ,vowels 变量,类型是 map[byte]struct{} ,我们其实也可以定义成其他的 map ,此处定义 map 主要是可以校验 map 中的 key 是否存在,是否存在元音字母, 这个 map 的 value 在此处是没有任何用的
这里也可以看出来我们使用的写入 byte 的方式,而不是字符串的方式,我们直接使用字符串的方式的话,会比较低效,直接使用字符会更加明确
四、总结:
那么看这道题我们单纯的看看时间复杂度是多少呢? O(n) 吗? nonono ,咱么仔细看一下我们都做了些啥
- 遍历题目给出的整个字符串
- 写入字符串到结果中,结果中包含原有字符串,空格,m 字符和 若干个 a 字符,这里面涉及到多次操作,时间复杂度度是 O(n^2)
那么对于空间复杂度,我们也要仔细的思考,我们是直接创建了一个结果字符串,里面包含的字符串会根据题目给出的字符串的不同,而得到不同的结果,此处的空间复杂度是 O(n^2)
原题地址:824. 山羊拉丁文
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~