Другим способом может быть
let a = [1,2,3,4,7,8,12,15,21,21,22,23]
let r = a.reduce((acc, val) => {
const lastGroup = acc.pop() || [];
const lastValue = lastGroup.slice(-1)[0];
if (val - lastValue > 1) {
return [...acc, lastGroup, [val]];
}
return [...acc, [...lastGroup, val]];
}, []).map(group => {
const first = group[0];
const last = group[group.length-1];
return first !== last ? `${first}-${last}` : `${first}`;
});
console.log(r)
Поместите все буквы в алфавитном порядке в строку (сортирующий алгоритм) и затем сравните получившую строку.
- Adam
Вид каждый элемент (удаляющий пробел) и выдерживает сравнение с предыдущим. Если они являются всеми одинаковыми, они - все анаграммы.
Хорошая вещь все мы живем в действительности C# оперативной сортировки коротких слов на четырехъядерных машинах с oozles памяти.:-)
Однако, если Вы, оказывается, ограниченная память и не можете коснуться исходных данных, и Вы знаете, что те слова содержат символы от более низкой половины таблицы ASCII, Вы могли пойти для другого алгоритма, который считает возникновение каждой буквы в каждом слове вместо сортировки.
Вы могли также выбрать тот алгоритм, если Вы хотите сделать это в O (N) и не заботитесь об использовании памяти (счетчик для каждого символа Unicode может быть довольно дорогим).
Интересно достаточно Невероятные Приключения Eric Lippert В Кодировании Блога имели дело с вариацией на эту самую проблему 4 февраля 2009 в этом сообщении.
Следующий алгоритм должен работать:
Отсортируйте буквы в каждом слове.
Отсортируйте отсортированные списки букв в каждом списке.
Сравните каждый элемент в каждом списке для равенства.
Отсортируйте буквы и сравните (побуквенный, строка выдерживают сравнение...) первые вещи, который приходит на ум.
char
в первой строке находят случаи его во втором