Вторая задача решается в 1 строку - [...new Set(myFruits)], Set это коллекция уникальных значений, которая на вход как раз принимает перебираемый обьект, коим и является массив, далее с помощью спред оператора разворачивает Set в новый массив
@@nhrafun я не проверял, но вроде как этот код выведе не только одно уникальное, а все которые встречаются. тоесть [1,1,2,2,3,4,5]. выведет 1 2 3 4 5. проверьте, не хочу сам
@@8020CodingНасколько я наслышан, знания методов это показатель компетентности, как по мне тоже показался нелепым вариантом использовать пару ключ-значение.
По условиям задачи на выходе у нас должен быть объект, поэтому можно просто использовать нативный метод groupBy объекта Object: list => Object.groupBy(list, ({ age }) => age) Да, аналогичный метод есть и у Map 🤓
4 задача, решение автора - квадратичная сложность (On^2) - тк двойной проход Почти все подобные задачи можно решить в один проход за On ,смотря в сторону использования мапы (обьект вспомогательный) const numbers = [3, 5, -4, 8, 11, 1, -1, 6]; const sum = 10; const map = {}; const fn = (numbers, sum) => { let result; for (let index = 0; index < numbers.length; index++) { const number = numbers[index]; if (map[sum - number]) { result = [sum - number, number]; index = numbers.length - 1; } if (!map[number]) { map[number] = sum - number; } result = []; } return result; }; console.log(fn(numbers, sum));
очень расточительно решаешь задачи)) на 5-ой задаче на каждой итерации создаешь новый массив, это дорого и долго. Можно было так: let arr=[]; for(item in friends){arr.push(item.pizzas)}; arr=arr.flat(2)
@@romanbrandt7986 решения, которые требуют значительно больше ресурсов, чем нужно - плохие. На собесе будут смотреть - понимаешь ты что и как ты делаешь или нет. Можно, конечно, гвозди микроскопом забивать, но это тебя будет характеризовать как проfнепригодного специалиста.
@@romanbrandt7986 когда И ЕСЛИ ты вдруг начнешь работать разработчиком, до тебя рано или поздно дойдет, что все задачи надо решать гигиенично и архитектурно в плане кода и оптимально в плане задействования ресурсов, это на автомате у тебя будет работать. Если не будет, ты выбрал не ту профессию, у тебя нет инженерного мышления. Так что иди учись) пока твои вопросы говорят, что ты этого не понимаешь)
Если в js прокатывает динамическое соддание ключей для объектов то в typscript нет, он ругается. В объекте есть механизм которые позволяет добавлять новые ключи со зданчением или тогда уже лучше пользоваться Map или Set?
4-я задача. Можно и так, но есть алгоритм быстрее (это нужно просто знать). Создаем 2-й массив из первого - из каждого элемента вычитаем искомое число (здесь 10) и ищем в исходном массиве число, противоположное полученному. При сортировке обеих массивов получим сложность O(n * log n), а не O(n^2).
Вполне возможен и вариант решения со сложностью алгоритма по времени O(n). Например, вот такой: const findFirstPairOfTerms = (arr, sum) => { const lib = new Set(); for (const num of arr) { const diff = sum - num; if (lib.has(diff)) { return [diff, num]; } lib.add(num); } return []; };
Спасибо, что поделились своим решением. 🙂 Весьма интересное. 👍 Хотя, мне кажется, что применение здесь цикла (indexOf) в цикле (filter) означает максимальную сложность алгоритма по времени O(n²). Поэтому производительность функции будет неизбежно падать на больших массивах с огромным количеством уникальных значений. 🤔
Задачи на собеседованиях используются для того, чтобы проверить навык соискателя на работу с той или иной технологией или знанию какой-либо части языка То есть задачи на собеседованиях не даются для того, что бы их "лиш бы решили, кто решил тот молодец" Если принять этот тезис за правду то тогда обозначенные задачи могли бы решаться следующим образом: _По одной задаче в дочернем комментарии_
*Задача 1: Сколько раз каждый элемент встречается в массиве:* Эта задача на предмет того, насколько соискатель владеет выражениями в JS ( (theTargetList) => ( theTargetList.reduce( (theRes, theCur) => ( (++theRes[theCur] || (theRes[theCur]=1), theRes) ) , {} ) ) ) (['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple']);
*Задача 2: Создать массив который содержит только уникальные значения* Это задача на знание того чем являются структуры map или set ( (theTargetList) => ( [...new Set(theTargetList)] ) ) (['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple']);
*Задача 4: Написать функцию, которая принимает два аргумент* массив из уникальных целых чисел и сумму в виде целого числа. Если сумма двух любых чисел массива из аргумента равна числу, которое приходит вторым аргументом, функция должна вернуть новый массив из этих двух чисел в любом порядке. Если решения нет, вернуть пустой массив. Это задача на то, насколько соискатель может мыслить не в лоб. Способен ли он импровизировать. Оригинальных решений у нее достаточно много. Обычно от соискателя ждут уточняющий вопрос, который помогает ему выбрать наиболее оптимальное. Например такое: ( (theListOfNumbers, theTargetSum) => ( theListOfNumbers.reduce( (theRes, theCur, theIndex, theArr) => { var theTarget; ( theArr.indexOf((theTarget=theTargetSum-theCur), ++theIndex) !== -1) && (theRes.push([theCur, theTarget])); return theRes; } , [] ) ) )([3, 5, -4, 8, 11, 1, -1, 6,4], 10);
Для первой задачки можно было ещё проще написать, как вариант) for (let el of fruits){ if (objFruit[`${el}`]){ objFruit[`${el}`] += 1; } else{ objFruit[`${el}`] = 1; } }
Спасибо, что поделились решением! Есть некоторые нюансы. 1) Пропущено важное объявление: const objFruit = Object.create(null); Инициализировать objFruit стоит именно так, а не через литерал пустого объекта, во избежание коллизий с именами унаследованных свойств от Object.prototype. 2) Можно воспользоваться преимуществом динамической типизации и вместо objFruit[`${el}`] просто писать эквивалентное objFruit[el] 3) Конструкцию if...else можно заменить одной строкой: objFruit[el] = (objFruit[el] || 0) + 1; Ну, а вообще. Здесь как-то уж очень напрашивается reduce: const objFruit = fruits.reduce((map, item) => { map[item] = map([item] || 0) + 1; return map; }, Object.create(null) );
Итого - нормально решена 1 задача из 6. С одной стороны - стыд и позор. С другой стороны - я спокоен за свое будущее - пока учат так, как на видео, я даже в 80 лет в глубоком маразме буду получать больше подавляющего числа выпускников таких курсов, бггг.
Так, вроде, именно в этом и заключается условие задачи, а вовсе не в возврате многоуровнего массива со всеми подходящими парами слагаемых. Поэтому в оптимальном решении должно быть предусмотрено: досрочный выход из цикла при нахождение первой пары; сохранение пройденных значений чисел в библиотеку для снижения максимальной сложности алгоритма по времени с квадратичной до линейной. В коде это можно реализовать примерно так: const findFirstPairOfTerms = (arr, sum) => { const lib = new Set(); for (const num of arr) { const diff = sum - num; if (lib.has(diff)) { return [diff, num]; } lib.add(num); } return []; };
Принцип YAGNI применим не только в коммерческой разработке, но и в спортивном (олимпиадном) программировании. Если постановкой задачи от нас требуется вернуть плоский массив из любимых пицц друзей, то результатом функции должен быть именно массив, а не коллекция Set. Если требование об уникализации списка пицц перед нами не ставилось, то и реализовывать его не следует. Меня больше смущает forEach (с нечистыми callback-функциями) в тех случаях, когда напрашивается reduce. При этом последний достаточно универсален, поэтому его применение часто является вполне заслуженным. Хотя в этом случае лучше действительно применить не его, а метод flatMap: const extractFavoritePizzas = friends => ( friends.flatMap(item => item.pizzas ?? []) );
4 решение ну такое себе (Вложенный цикл). В зависимости от размера массива, это решение станет очень долгим и затратным. есть лучше решение с object опять же) const findPairs = (nums, sum) => { const lib = {}; for (let i = 0; i < nums.length; i++) { const diff = sum - nums[i]; if (lib[diff]) return [diff, nums[i]]; lib[nums[i]] = i; } return []; }
@@MrBeasD... что причём тут это? это что тут причём не понял вопроса. Я ошибку то вижу у него в коде. и сразу увидел на каких числах будет баг. вот и написал автору, пусть попробует сумму 8 сделать . Ты странный дядя. формулируй мысли свои лучше
Для массива [6, 4] и значения суммы 10 будет возвращён пустой массив. Во всех случаях, когда одно из слагаемых находится на нулевом индексе, функция будет работать некорректно, поэтому lib[nums[i]] = i; лучше заменить на lib[nums[i]] = true; 🤔 Ну, и как по мне, вместо объекта лучше использовать коллекцию Set (const lib = new Set();), тогда 2-я и 3-я строки в теле цикла будут иметь следующий вид: if ( lib.has(diff) ) return [diff, nums[i]]; lib.add(nums[i]);
в 4 задаче автор привёл решение, которое работает за O(n^2), что очень плохо, такое решение на собесе не прокатит, следует приводить более быстрое решение
Спасибо за то, что делитесь! Решение выполнено методом brute force с полным перебором всех возможных вариантов. В данном решении нет досрочного завершения цикла при нахождении первой подходящей пары слагаемых. Та и сложность алгоритма по времени здесь равна O(n²). В варианте на видео она в 2 раза меньше (было учтено то, что порядок сложения не влияет на сумму [a + b эквивалентно b + a], путём задания стартового значения счётчика во внутреннем цикле), хотя и там она квадратичная. Но всё же есть возможность решить задачу с линейной сложностью O(n) и с досрочным завершением цикла. В JS-коде это будет выглядеть примерно так: const findFirstPairOfTerms = (arr, sum) => { const lib = new Set(); for (const num of arr) { const diff = sum - num; if (lib.has(diff)) { return [diff, num]; } lib.add(num); } return []; };
Комментарии по ходу просмотра: 1-я задача решена грязно. Нужно использовать Map. Официальные гайды и best practices однозначно рекомендуют использовать Map вместо object. К тому же на 11-й строке нужно использовать !count.hasOwnProperty(f) или "!(f in count)". Не зачет.
Согласен с тем, что коллекция Map была бы здесь более удачным выбором. Но в постановке задачи нам таки требуется вернуть object, поэтому даже решая через map нам потом следует результат преобразовать, вернув Object.fromEntries(count). Поэтому решать сразу через объект тоже вполне возможно. Да, !count.hasOwnProperty(f) было бы точнее, полностью поддерживаю. А вот для применения оператора in (или даже сравнения count[f] == null) объект следовало бы создавать без прототипа через Object.create(null), чтобы унаследованные свойства не влияли на корректность работы функции.
Вот работа из чего наша состоит? Взять данные с сервера и отрисовать их в шаблоне. Или взять данные от пользовать и отправить на сервер. А на собеседованиях реально эта чушь.
вместо создания объекта и потом вызова метода forEach, можно сразу использовать reduce, где начальное значение будет объект
или Set
Вторая задача решается в 1 строку - [...new Set(myFruits)], Set это коллекция уникальных значений, которая на вход как раз принимает перебираемый обьект, коим и является массив, далее с помощью спред оператора разворачивает Set в новый массив
Нет.
Тебе запросто скажут на собеседовании реши руками.
Третья тоже одной строкой решается:
Object.groupBy(list, ({ age }) => age)
Та и пятую можно проще решить:
friends.flatMap(({ pizzas }) => pizzas)
@@Илья-к6е5и да и нахер их послать сразу можно)
в пятой еще и уникальные было бы не плохо иметь, а не все подряд
2-ая задача: Array.from(new Set(array))
Пффф [...new Set(myFruits)] Спред? Не, не слышал
@@nhrafun под капотом там одно и то же
@@nhrafun я не проверял, но вроде как этот код выведе не только одно уникальное, а все которые встречаются. тоесть [1,1,2,2,3,4,5]. выведет 1 2 3 4 5. проверьте, не хочу сам
@@GonzaVladimir изучите работу Set() и проверка не будет иметь смысла
@@nhrafun ты хочешь сказать, что код [...new Set(myFruits)] покажет верно? тогда изучи сам иди
function uniqueItem(arr){
return Array.from(new Set(arr))
} решение для уникального значения в одну строчку
обычно на собесе тебя попросят решить данную задачу не используя new Set()
@@8020CodingНасколько я наслышан, знания методов это показатель компетентности, как по мне тоже показался нелепым вариантом использовать пару ключ-значение.
Нет
Спасибо за подобный контент, очень полезно 👍
Спасибо за поддержку!
Добрый день! Что вернет эта функция?
function getObject(arr) {
return arr.reduce((a, c) => a[c] ? a[c]++ : a[c] = 1, {})
}
1, она работает неправильно, нужно писать через return a
6-ая [...myStr].reduce((prev,next)=>next+prev)
str.split("").reverse().join("")
Спасибо за задачи!
Спасибо большое, брат!
3-я задача аналогична 1-й. Нужно использовать Map, где ключ - возраст, значение - массив имён
По условиям задачи на выходе у нас должен быть объект, поэтому можно просто использовать нативный метод groupBy объекта Object:
list => Object.groupBy(list, ({ age }) => age)
Да, аналогичный метод есть и у Map 🤓
j < nums.length - 1
Смысл в той задаче, где нужно найти nums, target ?Если решаешь ее через двойной цикл, который равен o(n2)?
4 задача, решение автора - квадратичная сложность (On^2) - тк двойной проход
Почти все подобные задачи можно решить в один проход за On ,смотря в сторону использования мапы (обьект вспомогательный)
const numbers = [3, 5, -4, 8, 11, 1, -1, 6];
const sum = 10;
const map = {};
const fn = (numbers, sum) => {
let result;
for (let index = 0; index < numbers.length; index++) {
const number = numbers[index];
if (map[sum - number]) {
result = [sum - number, number];
index = numbers.length - 1;
}
if (!map[number]) {
map[number] = sum - number;
}
result = [];
}
return result;
};
console.log(fn(numbers, sum));
Какая цветовая тема используется на видео?
Dracula
спасиб, топчик
очень расточительно решаешь задачи)) на 5-ой задаче на каждой итерации создаешь новый массив, это дорого и долго. Можно было так: let arr=[]; for(item in friends){arr.push(item.pizzas)}; arr=arr.flat(2)
@@romanbrandt7986 решения, которые требуют значительно больше ресурсов, чем нужно - плохие. На собесе будут смотреть - понимаешь ты что и как ты делаешь или нет. Можно, конечно, гвозди микроскопом забивать, но это тебя будет характеризовать как проfнепригодного специалиста.
@@romanbrandt7986 все, иди кури
@@romanbrandt7986 когда И ЕСЛИ ты вдруг начнешь работать разработчиком, до тебя рано или поздно дойдет, что все задачи надо решать гигиенично и архитектурно в плане кода и оптимально в плане задействования ресурсов, это на автомате у тебя будет работать. Если не будет, ты выбрал не ту профессию, у тебя нет инженерного мышления. Так что иди учись) пока твои вопросы говорят, что ты этого не понимаешь)
@@romanbrandt7986 вот ты его расчехлил😆😆😆, надо было оставит, пусть повыделывается))
@@romanbrandt7986 то что ты поставил после места работы скобочки намекает на то что ты врешь) доказать сможешЬ?
Если в js прокатывает динамическое соддание ключей для объектов то в typscript нет, он ругается. В объекте есть механизм которые позволяет добавлять новые ключи со зданчением или тогда уже лучше пользоваться Map или Set?
можно сделать луп по всем возрастам и создать ключи для каждого возраста, при этом значением можно задать null или пустой массив, как удобнее
4-я задача. Можно и так, но есть алгоритм быстрее (это нужно просто знать). Создаем 2-й массив из первого - из каждого элемента вычитаем искомое число (здесь 10) и ищем в исходном массиве число, противоположное полученному. При сортировке обеих массивов получим сложность O(n * log n), а не O(n^2).
Вполне возможен и вариант решения со сложностью алгоритма по времени O(n). Например, вот такой:
const findFirstPairOfTerms = (arr, sum) => {
const lib = new Set();
for (const num of arr) {
const diff = sum - num;
if (lib.has(diff)) {
return [diff, num];
}
lib.add(num);
}
return [];
};
task two
const uniqueItems = (list) => {
const res = list.filter((item, index) => list.indexOf(item) === index);
return res;
};
console.log(uniqueItems(fruits));
Спасибо, что поделились своим решением. 🙂 Весьма интересное. 👍 Хотя, мне кажется, что применение здесь цикла (indexOf) в цикле (filter) означает максимальную сложность алгоритма по времени O(n²). Поэтому производительность функции будет неизбежно падать на больших массивах с огромным количеством уникальных значений. 🤔
2 задача ``` const newArr = [...new Set(fruits)] ```
Задачи на собеседованиях используются для того, чтобы проверить навык соискателя на работу с той или иной технологией или знанию какой-либо части языка
То есть задачи на собеседованиях не даются для того, что бы их "лиш бы решили, кто решил тот молодец"
Если принять этот тезис за правду то тогда обозначенные задачи могли бы решаться следующим образом:
_По одной задаче в дочернем комментарии_
*Задача 1: Сколько раз каждый элемент встречается в массиве:*
Эта задача на предмет того, насколько соискатель владеет выражениями в JS
(
(theTargetList) => (
theTargetList.reduce(
(theRes, theCur) => (
(++theRes[theCur] || (theRes[theCur]=1), theRes)
)
, {}
)
)
)
(['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple']);
*Задача 2: Создать массив который содержит только уникальные значения*
Это задача на знание того чем являются структуры map или set
(
(theTargetList) => (
[...new Set(theTargetList)]
)
)
(['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple']);
*Задача 3: Создать функцию, которая сгруппирует студентов по возрасту*
Это задача подобно первой проверяет понимание выражений, с упором в Object
(
(theStudentList) => (
theStudentList.reduce(
(theRes, theCur) => (
(theRes[theCur.age] ||= []).push(theCur)
,theRes
)
,{}
)
)
)
( [
{ name: 'alex', age: 20 },
{ name: 'mike', age: 24 },
{ name: 'masha', age: 20 },
{ name: 'stas', age: 18 },
]);
*Задача 4: Написать функцию, которая принимает два аргумент*
массив из уникальных целых чисел и сумму в виде целого числа. Если сумма двух любых чисел массива из аргумента равна числу, которое приходит вторым аргументом, функция должна вернуть новый массив из этих двух чисел в любом порядке.
Если решения нет, вернуть пустой массив.
Это задача на то, насколько соискатель может мыслить не в лоб. Способен ли он импровизировать.
Оригинальных решений у нее достаточно много. Обычно от соискателя ждут уточняющий вопрос, который помогает ему выбрать наиболее оптимальное.
Например такое:
(
(theListOfNumbers, theTargetSum) => (
theListOfNumbers.reduce(
(theRes, theCur, theIndex, theArr) => {
var theTarget;
( theArr.indexOf((theTarget=theTargetSum-theCur), ++theIndex) !== -1)
&& (theRes.push([theCur, theTarget]));
return theRes;
}
, []
)
)
)([3, 5, -4, 8, 11, 1, -1, 6,4], 10);
*Задача 5: Получить единый массив из любимых пицц каждого друга*
Это задача на знание того что такое flat
(
(thePizzaList) => (
thePizzaList.reduce(
(theRes, theCur) => (theRes.push(theCur.pizzas),theRes)
, []
).flat()
)
)([
{ name: 'alex', pizzas: ['cheese', 'pepperoni'] },
{ name: 'mike', pizzas: ['salami', 'margarita'] },
{ name: 'stas', pizzas: ['meat'] },
{ name: 'anna', pizzas: ['fish'] }
]);
на всякий если решение повторяться ,я не смотрел заранее
const fruits = ['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple'];
const countFruit = (list) => {
let obj = {};
list.map((v,i)=>{
if(!obj[v]){
obj[v] = 1
}else{
(obj[v])++
}
})
console.log(obj)
return obj
}
countFruit(fruits)
если отличается от вашего кода, сделаете код ревью и оставляете отзывы
super, almost the same solution
task 2
const fruits = ['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple'];
const uniqueSet = new Set(fruits)
const arr = Array.from(uniqueSet)
console.log(arr)
task3
const students = [
{name: 'alex',age:20},
{name: 'mike',age:24},
{name: 'masha',age:20},
{name: 'stas',age:18},
];
function foo(list) {
resObj = {};
list.map((obj,index) => {
if(!resObj[obj.age]){
resObj[obj.age] = [obj]
} else {
resObj[obj.age].push(obj)
}
})
console.log(resObj)
}
foo(students)
same solution again
@@hrayrashchyan5925 const fruits = ['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple'];
const uniqueFruits = [...new Set(fruits)];
console.log(uniqueFruits)
думаю reduce можно в одну строку делать
третья задача попалась на реальном собеседовании
На какую зп ?
Для первой задачки можно было ещё проще написать, как вариант)
for (let el of fruits){
if (objFruit[`${el}`]){
objFruit[`${el}`] += 1;
}
else{
objFruit[`${el}`] = 1;
}
}
Спасибо, что поделились решением!
Есть некоторые нюансы.
1) Пропущено важное объявление:
const objFruit = Object.create(null);
Инициализировать objFruit стоит именно так, а не через литерал пустого объекта, во избежание коллизий с именами унаследованных свойств от Object.prototype.
2) Можно воспользоваться преимуществом динамической типизации и вместо objFruit[`${el}`] просто писать эквивалентное objFruit[el]
3) Конструкцию if...else можно заменить одной строкой:
objFruit[el] = (objFruit[el] || 0) + 1;
Ну, а вообще. Здесь как-то уж очень напрашивается reduce:
const objFruit = fruits.reduce((map, item) => {
map[item] = map([item] || 0) + 1;
return map;
}, Object.create(null) );
Итого - нормально решена 1 задача из 6.
С одной стороны - стыд и позор. С другой стороны - я спокоен за свое будущее - пока учат так, как на видео, я даже в 80 лет в глубоком маразме буду получать больше подавляющего числа выпускников таких курсов, бггг.
Открыл видео. Увидел решение первой задачи. Закрыл видео.
4я задача, если поставить больше цифр, или цифры которые в сумме тоже дадут "10", 5 5, 3 7, 4 6 ..... данная функция вернет только Первую пару.
const arr = [-1, 3, 5, 4, -4, 8, 11, 1, -1, 6];
const sum = 10;
function getSum(arr, sum) {
const res = [];
for (let i = 0; i < arr.length; i++) {
const eli = arr[i];
for (let j = i + 1; j < arr.length; j++) {
const elj = arr[j];
if (eli + elj === sum) {
res.push([eli, elj]);
}
}
}
return res;
}
console.log(getSum(arr, sum));
Так, вроде, именно в этом и заключается условие задачи, а вовсе не в возврате многоуровнего массива со всеми подходящими парами слагаемых. Поэтому в оптимальном решении должно быть предусмотрено: досрочный выход из цикла при нахождение первой пары; сохранение пройденных значений чисел в библиотеку для снижения максимальной сложности алгоритма по времени с квадратичной до линейной. В коде это можно реализовать примерно так:
const findFirstPairOfTerms = (arr, sum) => {
const lib = new Set();
for (const num of arr) {
const diff = sum - num;
if (lib.has(diff)) {
return [diff, num];
}
lib.add(num);
}
return [];
};
5-я задача. Как вы все любите reduce не по делу! Решается через Set. Заодно и быстрее будет
Принцип YAGNI применим не только в коммерческой разработке, но и в спортивном (олимпиадном) программировании. Если постановкой задачи от нас требуется вернуть плоский массив из любимых пицц друзей, то результатом функции должен быть именно массив, а не коллекция Set. Если требование об уникализации списка пицц перед нами не ставилось, то и реализовывать его не следует.
Меня больше смущает forEach (с нечистыми callback-функциями) в тех случаях, когда напрашивается reduce. При этом последний достаточно универсален, поэтому его применение часто является вполне заслуженным. Хотя в этом случае лучше действительно применить не его, а метод flatMap:
const extractFavoritePizzas = friends => (
friends.flatMap(item => item.pizzas ?? [])
);
👍
4 решение ну такое себе (Вложенный цикл). В зависимости от размера массива, это решение станет очень долгим и затратным.
есть лучше решение с object опять же)
const findPairs = (nums, sum) => {
const lib = {};
for (let i = 0; i < nums.length; i++) {
const diff = sum - nums[i];
if (lib[diff]) return [diff, nums[i]];
lib[nums[i]] = i;
}
return [];
}
сумма например 8, или -4.
@@MrBeasD... что причём тут это? это что тут причём не понял вопроса. Я ошибку то вижу у него в коде. и сразу увидел на каких числах будет баг. вот и написал автору, пусть попробует сумму 8 сделать . Ты странный дядя. формулируй мысли свои лучше
@@MrBeasD... я тебе скажу, что я только что кое что поправил и он работает. но ты должен сам понять
Для массива [6, 4] и значения суммы 10 будет возвращён пустой массив. Во всех случаях, когда одно из слагаемых находится на нулевом индексе, функция будет работать некорректно, поэтому lib[nums[i]] = i; лучше заменить на lib[nums[i]] = true;
🤔 Ну, и как по мне, вместо объекта лучше использовать коллекцию Set (const lib = new Set();), тогда 2-я и 3-я строки в теле цикла будут иметь следующий вид:
if ( lib.has(diff) ) return [diff, nums[i]];
lib.add(nums[i]);
в 4 задаче в java вылетела бы IndexOutOfBoundsException, элемент по j выходит за диапазон
2-я задача тоже решена грязно и не оптимально. Решается в 1 строчку:
return Array.from(new Set(list))
в 4 задаче автор привёл решение, которое работает за O(n^2), что очень плохо, такое решение на собесе не прокатит, следует приводить более быстрое решение
i've done
Получилось решить 4-ю задачу таким образом:
const findPairs = (numbers: number[], sum: number): number[] => {
let result: number[] = []
numbers.forEach((itemI: number, i: number) => {
numbers.forEach((itemJ: number, j: number) => {
if (i !== j && itemI + itemJ === sum) {
result = [itemI, itemJ];
}
})
})
return result;
}
Спасибо за то, что делитесь! Решение выполнено методом brute force с полным перебором всех возможных вариантов. В данном решении нет досрочного завершения цикла при нахождении первой подходящей пары слагаемых. Та и сложность алгоритма по времени здесь равна O(n²). В варианте на видео она в 2 раза меньше (было учтено то, что порядок сложения не влияет на сумму [a + b эквивалентно b + a], путём задания стартового значения счётчика во внутреннем цикле), хотя и там она квадратичная. Но всё же есть возможность решить задачу с линейной сложностью O(n) и с досрочным завершением цикла. В JS-коде это будет выглядеть примерно так:
const findFirstPairOfTerms = (arr, sum) => {
const lib = new Set();
for (const num of arr) {
const diff = sum - num;
if (lib.has(diff)) {
return [diff, num];
}
lib.add(num);
}
return [];
};
@@SerzhNesteruk Согласен, что по сложности не проходит и можно с одной итерацией. :)
6-я задача ок. Можно сделать быстрее через 2 индекса, но ладно, зачот.
Везде пихает forEach -_- , самый нерекомендуемый способ
умники в комментах собрались)))))))))))))
вторую задачу можно было написать в 2 строки
Комментарии по ходу просмотра:
1-я задача решена грязно. Нужно использовать Map. Официальные гайды и best practices однозначно рекомендуют использовать Map вместо object. К тому же на 11-й строке нужно использовать !count.hasOwnProperty(f) или "!(f in count)". Не зачет.
Согласен с тем, что коллекция Map была бы здесь более удачным выбором. Но в постановке задачи нам таки требуется вернуть object, поэтому даже решая через map нам потом следует результат преобразовать, вернув Object.fromEntries(count). Поэтому решать сразу через объект тоже вполне возможно.
Да, !count.hasOwnProperty(f) было бы точнее, полностью поддерживаю. А вот для применения оператора in (или даже сравнения count[f] == null) объект следовало бы создавать без прототипа через Object.create(null), чтобы унаследованные свойства не влияли на корректность работы функции.
Вот работа из чего наша состоит? Взять данные с сервера и отрисовать их в шаблоне. Или взять данные от пользовать и отправить на сервер. А на собеседованиях реально эта чушь.