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

简介: 本次刷题日记的第 40 篇,力扣题为:【刷题日记】824. 山羊拉丁文 ,简单

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

本次刷题日记的第 40 篇,力扣题为:【刷题日记】824. 山羊拉丁文简单

一、题目描述:

image.png

image.png

山羊拉丁文,看上去应该是一个简单拼接字符串的题目,那么为啥要叫山羊拉丁文呢?是一种语言吗?会有人群使用这种语言? 不得而知


二、这道题考察了什么思想?你的思路是什么?

不管怎么样,我们以解题,锻炼自己思维为目的,一起来看看这个题都给我们说了些啥?

  • 题目中给出的一个句子,空格分隔,有的是元音开头,有的不是
  • 我们需要将给出的句子转换成山羊拉丁文,处理的方式,遇到元音,直接在元音后面加 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. 山羊拉丁文

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

欢迎点赞,关注,收藏

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

image.png

好了,本次就到这里

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

我是阿兵云原生,欢迎点赞关注收藏,下次见~


相关文章
|
6月前
|
人工智能 搜索推荐 C++
小唐开始刷蓝桥(一)2020年第十一届C/C++ B组第二场蓝桥杯省赛真题
小唐开始刷蓝桥(一)2020年第十一届C/C++ B组第二场蓝桥杯省赛真题
|
6月前
|
人工智能 BI
牛客小白月赛66
牛客小白月赛66
40 0
|
Cloud Native
【刷题日记】682. 棒球比赛
本次刷题日记的第 11 篇,力扣题为:682. 棒球比赛 ,简单
|
Python
刷题记录-1蓝桥公园
刷题记录-1蓝桥公园
51 0
|
Cloud Native
【刷题日记】1037. 有效的回旋镖
本次刷题日记的第 58 篇,力扣题为:1037. 有效的回旋镖,简单
【刷题日记】1037. 有效的回旋镖
|
算法 Cloud Native
【刷题日记】875. 爱吃香蕉的珂珂
本次刷题日记的第 57 篇,力扣题为:875. 爱吃香蕉的珂珂,中等
146 0
【刷题日记】875. 爱吃香蕉的珂珂
|
索引 Cloud Native
【刷题日记】134. 加油站
【刷题日记】134. 加油站
下一篇
无影云桌面