JavaScript算法07-山羊拉丁文(leetCode:824)

山羊拉丁文


一、题目

给你一个由若干单词组成的句子 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(' ')
};

虽然写出来了,但内存消耗很大,不断的转换、拼接数组和字符串,不太聪明的亚子。。。

进阶写法

用到的方法:

  • 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(' ');
};

一行式代码,得分也很高
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值