Печать элементов, которые не удовлетворяют условию

#javascript

#javascript

Вопрос:

Я пытаюсь выполнить задачу HackerRank, которая включает в себя печать списка элементов массива, начиная со всех гласных, а затем всех согласных, но у меня возникли проблемы с этим.

 function vowelsAndConsonants(s) {
    var str = s;
    var arr = str.split("");
    var i;
    var vow = ["a","e","i","o","u","y"];
    var con = ['b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','z']
    for (i = 0; i < arr.length; i  ) {
        for (var j = 0; j< vow.length; j  ){
            if (arr[i] === vow[j]){
                console.log(arr[i])
            }
            
        }
    
    }
} 
  

Это то, что я получаю из приведенного выше кода, но я не могу напечатать согласные. Входная строка — «javascriptloops»

 a
a
i
o
o
  

Я также пробовал это

 function vowelsAndConsonants(s) {
    var str = s;
    var arr = str.split("");
    var i;
    var vow = ["a","e","i","o","u","y"];
    var con = ['b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','z']
    for (i = 0; i < arr.length; i  ) {
        for (var j = 0; j< vow.length; j  ){
            if (arr[i] === vow[j]){
                console.log(arr[i])
                break;
            }
            
        }
    
        for (var j = 0; j< con.length; j  ){
            if (arr[i] === con[j]){
                console.log(arr[i])
            }
                
        }
    }
          
}
  

Но вот что у меня было

 j
a
v
a
s
c
r
i
p
t
l
o
o
p
s
  

Комментарии:

1. итак, где второй цикл?

2. вы должны посмотреть на array includes

3. Вы должны выйти из цикла, как только найдете совпадение.

4. Просто выполните второй for цикл поиска con вместо vow , в чем проблема?

Ответ №1:

Простым решением было бы выполнить цикл дважды:

 function vowelsAndConsonants(s) {
    let vowels = ["a", "e", "i", "o", "u"];

    for(let v of s) {
        if(vowels.includes(v))
            console.log(v);
    }
    for(let v of s) {
        if(!vowels.includes(v))
            console.log(v);
    }
}
  

Комментарии:

1. При этом используется языковая конструкция, для решения алгоритмических задач лучше использовать простые циклы for . В будущем интервьюер может попросить начинающего тему создать includes функцию, но он не сможет этого сделать, и это может стоить ему возможности

Ответ №2:

Хорошей идеей будет определить меньшее подмножество (гласные) и рассматривать остальные буквы алфавита как согласные.

Кроме того, присвоение имен вашим переменным имеет большое значение для удобства чтения

 function vowelsAndConsonants(s) {
  var letters = s.split("");
  const vowels = ["a", "e", "i", "o", "u", "y"];
  for (const letter of letters) { // we are cycling through the letters to find all vowels
    for (const vowel of vowels) { // now we are cycling through the list of vowels
      if (letter === vowel) { // if we found a vowel in the vowel list, print it and stop searching for other vowels (break)
        console.log(letter);
        break;
      }
    }
  }

  // Searching for consonants is trickier
  for (const letter of letters) { // we cycle again through the letters
    let consonant = true; // we assume that the letter is consonant until it's proven otherwise

    for (const vowel of vowels) { // cycling through the list of vowels
      if (letter === vowel) { // if we found that the letter is vowel
        consonant = false; // we set the flag to false
        break; // and stop searching more as we know already that it is a vowel
      }
    }

    if (consonant === true) { // if after cycling we realized that this is a consonant, and not a vowel - print it
      console.log(letter)
    }
  }
}

vowelsAndConsonants("normal");  

Ответ №3:

есть решение, вы можете взглянуть

 function vowelsAndConsonants(s) {
    var str = s;
    var arr = str.split("");
    var vow = ["a","e","i","o","u","y"];
   
    
    const ordered = arr.reduce( (res, letter) => {
      if (vow.includes(letter)) {
        return {...res, vow: [...res.vow, letter]}
      }

      return {...res, con: [...res.con, letter]}
    }, { con: [], vow: []});
    
    return ordered.vow.join('')   ordered.con.join('');
} 

  

Ответ №4:

Ваш внешний цикл должен выполняться дважды.

Это решение также использует for ... in циклы и array.includes() , что немного чище, чем стандарт вложенности для циклов.

 const vowelsAndConsonants = s => {
  const vow = ['a','e','i','o','u','y'];
  for (const c of s)
    if (vow.includes(c))
      console.log(c)
  for (const c of s)
    if (!vow.includes(c))
      console.log(c)
}
    
vowelsAndConsonants('javascriptloops')  

Ответ №5:

Вы можете использовать filter() вместо циклов:

 var vow = ['a','e','i','o','u','y'].join('');
var str = 'javascriptloops'.split('');

console.log(str.filter(x => vow.includes(x)));   // vowels
console.log(str.filter(x => !vow.includes(x)));  // consonants (not vowels)  

Ответ №6:

 const f = s => {
  const isVowel = char => ['a', 'e', 'i', 'o', 'u'].includes(char);
  const letters = s.split('');
  const consonants = letters.reduce((result, letter) => {
    if (isVowel(letter)) console.log(letter);
    else result.push(letter);
    return resu<
  }, []);
  consonants.forEach(c => console.log(c))
}

f('javascriptloops');