Top.Mail.Ru
Ответы

Сравнение массивов, какой алгоритм можно применить?

Дано:
Два массива, содержащих строки.
Вернуть: массив состоящий из чисел, которые показывают, сколько раз каждая строка из второго массива появляется в первом массиве.

Пример:
array1 = ['abc', 'abc', 'xyz', 'cde', 'uvw']
array2 = ['abc', 'cde', 'uap']

solve(array1, array2) = [2, 1, 0]; //abc 2 раза, cde 1 раз, uap 0 раз

Понимаю, что задание лёгкое, и решается обычным перебором с помощью вложенного цикла. Но ведь такой метод очень затратный. А если массивы очень длинные, как быть? У кого есть более изящные решения? Или хотя бы просто сократить запись. Поделитесь опытом.

По дате
По рейтингу
Аватар пользователя
Новичок

Сравнить массивы можно только их перебором. Даже с хэштаблицей, два прохода (+1 на взятие результатов) это минимум.

В современном JS, это удобно через словарь (который оптимизирован для поиска, и типкастится во что угодно):
const foo = (values, search) => values.reduce(
 (rslt, v) => rslt.has(v) ? rslt.set(v, rslt.get(v) + 1) : rslt
, new Map(search.map(v => [v, 0])));

Аватар пользователя
Гений

function solve(arr1, arr2) {
let obj = {};
for (let i = 0; i < arr1.length; i++) {
obj[arr1[i]] = (obj[arr1[i]] || 0) + 1;
}

for (let i = 0; i < arr2.length; i++) {
arr2[i] = obj[arr2[i]] || 0;
}

return arr2;
}

Должно быть быстрее... 1 циклом тупо считает всё в большом массиве, вторым записывает в маленький.