首页 文章

FCC中间算法脚本:Pig Latin

提问于
浏览
1

这个测试目标是取一个英语单词的第一个辅音(或辅音簇),将它移到单词的末尾,后缀为“ay” . 如果一个单词以元音开头,你只需添加“way”到最后 .

我的主要问题是迭代字符串直到它到达元音并将第一个辅音字母放到字符串的末尾 .

我在遍历字符串时遇到麻烦,直到它到达元音 . 你如何迭代一个字符串直到它停在第一个元音?你怎么得到所有的第一个辅音字母才能达到元音?我使用for循环迭代字符串,如果第一个字母是辅音,我使用“if”语句 .

function translatePigLatin(str) {
  var vowel = /[aeiou]/g;
  var cons = /[^aeiou]/g;
  console.log(cons.test(str[2]))
  var consonants = [];
  var index = str.charAt(0);

  console.log(str.slice(1, str.length))
  for(var i = 0; i < str.length; i++){
    console.log(str[i])
    if(cons.test(str[i])){
      consonants.push(str.charAt(i));
      console.log(consonants)
      var slice = str.slice(consonants.length, str.length);
    }
  }
  return consonants + 'ay';
}

translatePigLatin( “手套”);

2 回答

  • 1

    我会专注于找到第一个元音的索引 . 然后,您可以测试该索引是否为0或其他内容 . 如果它为零,只需在该索引上添加 way 否则切片:

    function translatePigLatin(str) {
      const vowels = ['a', 'e', 'i', 'o', 'u'];
      let ind = [...str.toLowerCase()].findIndex(s => vowels.includes(s))
      return ind 
             ? str.slice(ind) + str.slice(0, ind) + 'ay' // doesn't start with vowel
             : str + 'way'
    }
    
    console.log(translatePigLatin('glove'))
    console.log(translatePigLatin('apple'))
    console.log(translatePigLatin('Mark'))
    console.log(translatePigLatin('Javascript'))
    

    我不确定猪拉丁规则对于没有像 rhythm 这样的元音的单词的边缘情况 .

  • 2

    我认为您应该将问题分解为一些基本情况,就像我在下面的代码中所做的那样:

    • 检查第一个字母是否是元音;如果为true,只需在单词的末尾添加'way'并打破循环

    • 如果当前字母是辅音(这意味着第一个条件不是真的),我们只是继续迭代

    • 如果当前字母是元音,我们将单词分成两个单独的部分,然后我们将它们添加到另一个方向,而不是忘记添加'ay'后缀 .

    在下面的代码中,我还在元音数组中添加了大写版本 . 通过一些修改,可以跳过分隔符 . 猪拉丁规则是我在维基百科上找到的规则(虽然我没有找到任何关于辅音的单词规则,所以我把它们放在第一个案例中) . 干杯!

    function has(a, e) {
        return a.indexOf(e) > -1;
    }
    
    function translateWord(str) {
        let vows = ['a', 'e', 'i', 'o', 'u'];
        vows = vows.concat(vows.map(v => v.toUpperCase()));
    
        let lastVowelIndex = 0;
        let conv = '';
        
        for (let i = 0; i < str.length; ++i) {
            let currentChar = str[i];
            
            /* If the first character is a voewl, we just
             * add the 'way' suffix to the initial word.
             * I applied the same rule for words without
             * consonants.
             */
            if ((i === 0 && has(vows, currentChar))
                || (i === str.length - 1)) {
                conv = str + 'way';
                break;
            }
            
            /* If the current character is a consonant, we
             * just continue until we reach a vowel.
             */
            if (!has(vows, currentChar))
                continue;
            
            /* At this point, we reached a vowel, so we do the
             * appropriate transformations.
             */
            let firstPart =  str.slice(0, i);
            let secondPart = str.slice(i);
            
            conv = secondPart + firstPart + 'ay';
            break;
        }
        
        return conv;
    }
    
    function translateToPigLatin(str) {
        let words = str.split(' ');
        let converted = words.map(w => translateWord(w));
        
        return converted.join(' ');
    }
    
    let s = translateToPigLatin("I have no rythm");
    console.log(s);
    

相关问题