#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');