山羊拉丁文
一、题目
给你一个由若干单词组成的句子 sentence
,单词间由空格分隔。每个单词仅由大写和小写英文字母组成。
请你将句子转换为 “山羊拉丁文(Goat Latin)”(一种类似于 猪拉丁文 - Pig Latin 的虚构语言)。山羊拉丁文的规则如下:
- 如果单词以元音开头(
'a'
,'e'
,'i'
,'o'
,'u'
),在单词后添加"ma"
。
例如,单词"apple"
变为"applema"
。 - 如果单词以辅音字母开头(即,非元音字母),移除第一个字符并将它放到末尾,之后再添加
"ma"
。
例如,单词"goat"
变为"oatgma"
。 - 根据单词在句子中的索引,在单词最后添加与索引相同数量的字母
'a'
,索引从1
开始。
例如,在第一个单词后添加"a"
,在第二个单词后添加"aa"
,以此类推。
返回将sentence
转换为山羊拉丁文后的句子。
示例1:
输入:sentence = "I speak Goat Latin"
输出:"Imaa peaksmaaa oatGmaaaa atinLmaaaaa"
示例2:
输入:sentence = "The quick brown fox jumped over the lazy dog"
输出:"heTmaa uickqmaaa rownbmaaaa oxfmaaaaa umpedjmaaaaaa overmaaaaaaa hetmaaaaaaaa azylmaaaaaaaaa ogdmaaaaaaaaaa"
提示:
1 <= sentence.length <= 150
sentence
由英文字母和空格组成sentence
不含前导或尾随空格sentence
中的所有单词由单个空格分隔
二、分析
三、解法
一种很菜的方法
/**
* @param {string} sentence
* @return {string}
*/
var toGoatLatin = function(sentence) {
let arr = sentence.split(' ');
const s = arr.length
let newArr = []
for (let i = 0; i < s; i++) {
let newWordList = arr[i].split('')
if (newWordList[0].toLowerCase() !== 'a' && newWordList[0].toLowerCase() !== 'e' && newWordList[0].toLowerCase() !== 'i' && newWordList[0].toLowerCase() !== 'o' && newWordList[0].toLowerCase() !== 'u') {
// 辅音开头
newWordList.push(newWordList.shift())
}
newWordList.push('ma')
newWordList.push(...new Array(newArr.length + 1).fill('a'))
newArr.push(newWordList.join(''))
}
return newArr.join(' ')
};
![](https://i-blog.csdnimg.cn/blog_migrate/f89324229c51f18ba729bb13125d8ec1.png)
虽然写出来了,但内存消耗很大,不断的转换、拼接数组和字符串,不太聪明的亚子。。。
进阶写法
用到的方法:
- set对象--
Set.prototype.add(value)
、Set.prototype.has(value)
- str.
split('')
– 字符串转数组 - str.
charAt(1)
– 返回指定位置的字符 - str.
substring(0, 1)
或 str.slice(0, 1)
– 提取字符串中两个指定索引号之间的字符 - arr.
join('-')
– 数组转字符串
const vowels = new Set();
vowels.add('a');
vowels.add('e');
vowels.add('i');
vowels.add('o');
vowels.add('u');
vowels.add('A');
vowels.add('E');
vowels.add('I');
vowels.add('O');
vowels.add('U');
/**
* @param {string} sentence
* @return {string}
*/
var toGoatLatin = function(sentence) {
return sentence.split(" ").map((word, index) => {
const res = new Array()
if(vowels.has(word.charAt(0))) {
res.push(word)
} else {
res.push(word.substring(1))
res.push(word.substring(0, 1))
}
res.push("ma"+"a".repeat(index+1))
}).join(" ")
};
大佬式写法
用到了正则、split()、substring()、repeat()、join()
- str.
repeat(count)
– 生成重复字符
var toGoatLatin = function (sentence) {
return sentence
.split(' ')
.map((word, index) => {
return (/^[aeiou]/i.test(word) ? word : word.substring(1) + word[0]) + 'ma' + 'a'.repeat(index + 1);
})
.join(' ');
};
一行式代码,得分也很高