Golang 空哈希集合和 strings.Builder:求解《824. 山羊拉丁文》

2022-04-21 05:04:32

用 Golang 的空哈希集合和 strings.Builder 求解《824. 山羊拉丁文》

Golang 的 Grow(n int) 指定初始内存大小,减少分配内存的时间示意图


Golang 的 strings.Builder

例题

824. 山羊拉丁文

给你一个由若干单词组成的句子 sentence ,单词间由空格分隔。每个单词仅由大写和小写英文字母组成。 请你将句子转换为 “山羊拉丁文(Goat Latin)”(一种类似于 猪拉丁文 - Pig Latin 的虚构语言)。山羊拉丁文的规则如下: 如果单词以元音开头('a', 'e', 'i', 'o', 'u'),在单词后添加"ma"。 例如,单词 "apple" 变为 "applema" 。 如果单词以辅音字母开头(即,非元音字母),移除第一个字符并将它放到末尾,之后再添加"ma"。 例如,单词 "goat" 变为 "oatgma" 。 根据单词在句子中的索引,在单词最后添加与索引相同数量的字母'a',索引从 1 开始。 例如,在第一个单词后添加 "a" ,在第二个单词后添加 "aa" ,以此类推。 返回将 sentence 转换为山羊拉丁文后的句子。

答案

JavaScript · split
var toGoatLatin = function(sentence) {
  const s = new Set(['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'])
  return sentence.split(' ').map((v, i) => (s.has(v[0]) ? v : v.substring(1) + v[0]) + 'ma' + 'a'.repeat(i + 1)).join(' ')
};
Golang · 空 Set
func toGoatLatin(sentence string) string {
  type void struct{}
  var value void
  var set map[rune]void
  set = map[rune]void{'a':value,'e':value,'i':value,'o':value,'u':value,'A':value,'E':value,'I':value,'O':value,'U':value,}
  isSpace := true
  r, s, index := "", "", 1
  sentence += " "
  for _, v := range sentence {
    if isSpace {
      _, ok := set[v]
      if ok {
        s = "ma"
        r += string(v)
      } else {
        s = string(v) + "ma"
      }
      isSpace = false
    } else {
      if v == ' ' {
        isSpace = true
        r += s
        s = ""
        for j := 0; j < index; j++ {
          r += "a"
        }
        index++
        r += " "
      } else {
        r += string(v)
      }
    }
  }
  return r[:len(r) - 1]
}
JavaScript · substring / slice
var toGoatLatin = function(sentence) {
  const s = new Set(['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'])
  const n = sentence.length
  let index = 1, r = ''
  for (let i = 0; i < n; i++) {
    let j = i
    while (j < n && sentence[j] != ' ') j++
    if (s.has(sentence[i])) r += sentence.substring(i, j)
    else r += sentence.substring(i + 1, j) + sentence[i]
    r += 'ma'
    for (let k = 0; k < index; k++) r += 'a'
    index++
    r += ' '
    i = j
  }
  return r.slice(0, -1)
};
Golang · 空 set · strings.Builder{}
func toGoatLatin(sentence string) string {
  set := map[byte]struct{}{'a':{},'e':{},'i':{},'o':{},'u':{},'A':{},'E':{},'I':{},'O':{},'U':{}}
  n, r, index := len(sentence), &strings.Builder{}, 1
  for i := 0; i < n; i++ {
    j := i
    for j < n && sentence[j] != ' ' {
      j++
    }
    if _, ok := set[sentence[i]]; ok {
      r.WriteString(sentence[i : j])
    } else {
      r.WriteString(sentence[i + 1 : j])
      r.WriteByte(sentence[i])
    }
    r.WriteString("ma")
    for k := 0; k < index; k++ {
      r.WriteByte('a')
    }
    if j < n - 1 {
      r.WriteByte(' ')
    }
    index++
    i = j
  }
  return r.String()
}
自定义排序:求解《937. 重新排列日志文件》
自定义排序和 Golang 的字符串分割函数,求解《937. 重新排列日志文件》
消元法,正则和栈:求解《591. 标签验证器》
消元法,正则和栈,求解《591. 标签验证器》
RabinKarp 哈希算法:求解《796. 旋转字符串》《459. 重复的子字符串》和《1316. 不同的循环子字符串》
RabinKarp 哈希算法,求解《796. 旋转字符串》《459. 重复的子字符串》和《1316. 不同的循环子字符串》