【刷题日记】824. 山羊拉丁文

1,644 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情

【刷题日记】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. 山羊拉丁文

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~