#javascript #arrays #algorithm #scope #closures
#javascript #массивы #алгоритм #область #замыкания
Вопрос:
Инструкции следующие:
«Напишите функцию, которая найдет все анаграммы слова из списка. Вам будут предоставлены два входных данных — слово и массив со словами. Вы должны вернуть массив всех анаграмм или пустой массив, если таковых нет. Например:
анаграммы(‘abba’, [‘aabb’, ‘abcd’, ‘bbaa’, ‘dada’]) => [‘aabb’, ‘bbaa’]»
Я поймал фрагмент, который принимает первый параметр и предоставляет все возможные комбинации символов. Моя проблема сейчас заключается в том, чтобы выяснить, как сопоставить этот массив со вторым параметром и вернуть некоторые результаты..
function allAnagrams (word,words) {
if (word.length < 2) {
return [word];
} else {
var allAnswers = [];
for (var i = 0; i < word.length; i ) {
var letter = word[i];
var shorterWord = word.substr(0, i) word.substr(i 1, word.length - 1);
var shortwordArray = allAnagrams(shorterWord);
for (var j = 0; j < shortwordArray.length; j ) {
allAnswers.push(letter shortwordArray[j]);
}
}
return allAnswers;
}
}
allAnagrams("abc",["acb","cba","bac","bca"]);
Моим инстинктом было разделить слово на массив, а затем создать еще один вложенный цикл for, чтобы соответствовать тому, что нужно сопоставить. Однако, похоже, я столкнулся с некоторыми проблемами с обработкой области видимости и продолжаю нарушать функцию, поэтому я обратился к вам, люди с блестящим умом. Если у вас есть минутка, я был бы признателен за подсказку о том, как решить это отсюда.
Ответ №1:
В основном вам нужно посмотреть, появляется ли какая-либо перестановка вашей первой строки в массиве.
Быстрый способ сравнить, являются ли две строки перестановками друг друга, — это отсортировать две строки и сравнить:
function stringSort(string) {
return string.split('').sort().join('');
}
function isAnagram(first, second) {
// are the two sorted strings equal, if so then anagram
return stringSort(first) == stringSort(second);
}
Теперь мы можем использовать эти удобные функции, чтобы помочь нам создать конечную желаемую функцию:
function allAnagrams(word, words) {
return words.filter(function(element) {
return isAnagram(word, element);
});
}
Обратите внимание на использование Array#filter
, очень удобного метода для сведения массива к нескольким значениям при некоторых условиях.
Обратите внимание, что я не тестировал это, поэтому, если есть какие-либо проблемы, пожалуйста, спросите.
Комментарии:
1. Это хорошо. Может быть оптимизировано путем предварительного вычисления
stringSort(word)
.2. @Amadan Я понял, когда создавал это, что использовал термин «быстрый», не предпринимая никаких попыток оптимизировать xD
3. Это круто, действительно полезно знать. Если вы не возражаете, объясните, из чего именно извлекается параметр ‘element’? И будет ли предварительное вычисление, как сказал Амадан, просто добавлять разделяющее строку / сортирующее «слово» в функцию allAnagrams?
4. Вы можете взглянуть на все ссылки, которые я предоставляю в своем посте @Benediah, например, смотрите здесь Array#filter , чтобы узнать, что
element
такое5. @Benediah вы также всецело заинтересованы в реализации и экспериментировании с моим кодом, попробуйте добавить
console.log(element)
, например.