用 Golang 的空哈希集合和 strings.Builder 求解《824. 山羊拉丁文》
strings.Builder
strings.Builder
避免 string
不断被销毁重建问题buf []byte
写入字符unsafe.Pointer
存指针转换,将 buf []byte
转 string
,避免内存分配Grow(n int)
指定初始内存大小,减少分配内存的时间(如图所示)给你一个由若干单词组成的句子 sentence ,单词间由空格分隔。每个单词仅由大写和小写英文字母组成。 请你将句子转换为 “山羊拉丁文(Goat Latin)”(一种类似于 猪拉丁文 - Pig Latin 的虚构语言)。山羊拉丁文的规则如下: 如果单词以元音开头('a', 'e', 'i', 'o', 'u'),在单词后添加"ma"。 例如,单词 "apple" 变为 "applema" 。 如果单词以辅音字母开头(即,非元音字母),移除第一个字符并将它放到末尾,之后再添加"ma"。 例如,单词 "goat" 变为 "oatgma" 。 根据单词在句子中的索引,在单词最后添加与索引相同数量的字母'a',索引从 1 开始。 例如,在第一个单词后添加 "a" ,在第二个单词后添加 "aa" ,以此类推。 返回将 sentence 转换为山羊拉丁文后的句子。
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(' ')
};
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]
}
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)
};
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()
}