Первая задача. Можно в одну строчку сделать или наоборот подробнее разложить. Ненавижу читать рекурсию + я могу ошибаться, но у тебя !object[array[i]] вернет undefined для null function get(initialObject, path) { return path.split('.').reduce((currentObject, currentKey) => { if (!(currentKey in currentObject)) { return undefined; } return currentObject[currentKey]; }, initialObject); }
Собеседуемый, молодец, так надо уметь разговор поддерживать. 1. Задача, можно рекурсией можно в цикле for разбиваем путь через split('.'), получаем ключ и остаток пути, и передаем их дальше вызывая эту же функцию и делаем два выхода один когда у нас путь закончится, будет длиной 0, второй когда obj будет undefined возвращаем undefined. function get(obj, path) { if (path.length === 0) { return obj } if (obj === undefined) { return undefined } const [key, ...rest] = path.split('.'); return get(obj[key], rest.join('.')) } на цикл function get(obj, path) { let result = { ...obj }; const paths = path.split('.') for (const key of paths) { result = result[key] if (result === undefined) { return undefined } } return result; } 2. через массив чтобы таких условий не делать, хотя все равно не идеально :( function rle(str) { const result = []; let pointer = str[0]; for (let i = 1; i < str.length; i++) { if (pointer[0] === str[i]) { pointer += str[i] } else { result.push(pointer) pointer = str[i] } } result.push(pointer); return result.map(letter => letter.length === 1 ? letter : `${letter[0]}${letter.length}`) .join('') }
Добрый день, в обозримом будущем хотелось бы попасть на стажировку в яндекс, может быть уважаемые господа дадите совет или направление, на что сделать упор в задачах и какого уровня примерно спрашивают задачи на позицию стажера. Пока решаю codewar, задачи 6k даются сложно.
В задаче про массив забавные условия на 7-8 строках (присвоение вместо сравнения) ) Понятно, что это просто опечатка, но собеседующая добрая (или не обратила внимание).
привет! посмотрел с интересом, в процессе накидывал решения :) 1 задачу сделал бы так: function get(obj, chain) { return chain?.split('.').reduce((acc, key) => acc?.[key], obj); } 2 можно тоже в одну строку, гораздо быстрее (для достаточно длинных строк - на порядок) будет регуляркой: function rle(input) { return input.match(/(\w)\1*/g).reduce((acc, v) => acc += v[0] + (v.length > 1 ? v.length : ''), ''); } 3 ваше решение нерабочее по нескольким причинам: интерпретатор ругнётся на return throw (уже писали в комментах) + если после неудачной попытки будет успешная - первый Promise из call stack всё равно не будет заресолвлен. я бы реализовал так: function get(url) { return new Promise(async (resolve, reject) => { let retries = 5; while (retries) { await fetch(url) .then((res) => { if (!res.ok) throw new Error(); // сюда попадёт, например, ошибка 500 resolve(res); retries = 0; }) .catch((e) => (retries--)); } reject('Retry count exceeded'); }); } 4 function isMonotonic(array) { return array.reduce((acc, value, index) => { if (acc.result && index) { const delta = Math.sign(value - array[index - 1]); if (acc.sign && delta && delta != acc.sign) acc.result = false; acc.sign = delta; } return acc; }, { sign: 0, result: true }).result; }
Ваше решение второй задачи вызывает вопросы, сложно написать такую регулярку на собесе и не ошибиться. Также мне кажется, что столь короткая запись может быть непонятна интервьюверу и это в минус пойдет.
@siberian-crystall Ваши решения конечно же гораздо лучше и самое главное - рабочие (в отличие от например, решения задачи 3 на видео). Однако в ваших решениях 1 и 4 есть недостаток: отсутствует предварительный выход из-за использования непрерываемых массивных методов. Т.е., алгоритм в любом случае переберёт весь массив, даже если мы уже можем сделать однозначный вывод, что результат undefined или false. В задаче 4 лучше всего воспользоваться циклом с предварительным return false, а в задаче 1 - рекурсивной функцией или циклом с предварительным return void 0. А задача 2 может быть решена ещё проще и оптимизированее: function rle(input) { return input.replace(/(\w)\1{1,}/g, (str, char) => char + str.length); } Однако отмечу, что попытка решить сложные задачи используя минимальное количество строк кода - не лучшая привычка. Код должен быть очевиден для того, кто его будет читать и пусть код будет многословен - минификаторы за вас его сожмут на этапе билда проекта.
Привет, второй этап я также успешно прошел, там было две алгоритм задачки, но его к сожалению я его не записал, можешь в тг моем увидеть что за задачи там были. Третий этап полностью разговорный, там не сильно интересно, вопросы про опыт и на софт скиллы
первая банальная задача.. но очень хорошо показывает опыт программиста и его харды. у вам хеш таблица и путь это ключи! какая нафиг рекурсия..😂 задача на знание js и структур данных. читайте ребят книги! они очень полезные.. кто знает как распаковать объект? вот вам и ответ на задачу. учите структуры данных!..
Сложность оценки алгоритма обязательно нужно называть на подобного рода собесах. После этого был второй алгоритмический этап, там две алгоритмические задачи было, прямо спрашивают сложность алгоритма, если ты не не говоришь. А про компании уровня фаанг я молчу.
4 задача как вариант. function isMonotonic(num) { const mono1 = [...num].sort((a, b) => a - b); const mono2 = [...num].sort((a, b) => b - a); if (mono1.join('') === num.join('') || mono2.join('') === num.join('')) { return true; } return false; }
слабо, очень много нелепых комментариев от тебя по ходу собеса, которыми себя же и зарываешь, создается впечатление, что ты не понимаешь о чем говоришь, даже если это не так. Хоть и атмосфера на собесе - "дружеская беседа", это все еще собеседование и любое твое слово будет использовать против тебя в фидбэке) удачи в обучении
@@topsy_kreds видимо комментарий мне, но я и второй раунд алгоритмическую секцию успешно прошел. И все это с первого раза, если это слабо, то что же, меня такая слабость устраивает 🙂
Так и надо. Именно рассуждения в слух на собесах и любят. Видимо с молчунами им скучно и заворачивают если конечно это не сеньор которому никакие собесы не нужны.
@@psevdonim257 ищи на линкедин разрабов которые работают в нужных тебе компаниях , пиши им и проси рефералку. В большинстве топ компаний есть рекомендательная реферальная система.
Первая задача. Можно в одну строчку сделать или наоборот подробнее разложить. Ненавижу читать рекурсию + я могу ошибаться, но у тебя !object[array[i]] вернет undefined для null
function get(initialObject, path) {
return path.split('.').reduce((currentObject, currentKey) => {
if (!(currentKey in currentObject)) {
return undefined;
}
return currentObject[currentKey];
}, initialObject);
}
Собеседуемый, молодец, так надо уметь разговор поддерживать.
1. Задача, можно рекурсией можно в цикле for
разбиваем путь через split('.'), получаем ключ и остаток пути, и передаем их дальше вызывая эту же функцию
и делаем два выхода один когда у нас путь закончится, будет длиной 0, второй когда obj будет undefined возвращаем undefined.
function get(obj, path) {
if (path.length === 0) {
return obj
}
if (obj === undefined) {
return undefined
}
const [key, ...rest] = path.split('.');
return get(obj[key], rest.join('.'))
}
на цикл
function get(obj, path) {
let result = { ...obj };
const paths = path.split('.')
for (const key of paths) {
result = result[key]
if (result === undefined) {
return undefined
}
}
return result;
}
2. через массив чтобы таких условий не делать, хотя все равно не идеально :(
function rle(str) {
const result = [];
let pointer = str[0];
for (let i = 1; i < str.length; i++) {
if (pointer[0] === str[i]) {
pointer += str[i]
} else {
result.push(pointer)
pointer = str[i]
}
}
result.push(pointer);
return result.map(letter => letter.length === 1 ? letter : `${letter[0]}${letter.length}`)
.join('')
}
Спасибо за видео. Недавно тоже первый этап проходил, все задач разные, но у нас с тобой схожи с retryFetch)
@@dididie158 а какие у тебя задачи были?
28:41 "Ну давай оценю сложность алгоритма🥺🥺🥺" Боже, как он ее упрашивал)) Ведь готовился
Добрый день, в обозримом будущем хотелось бы попасть на стажировку в яндекс, может быть уважаемые господа дадите совет или направление, на что сделать упор в задачах и какого уровня примерно спрашивают задачи на позицию стажера. Пока решаю codewar, задачи 6k даются сложно.
Leetcode популярен, вот план обучения: leetcode.com/explore/featured/card/the-leetcode-beginners-guide/679/sql-syntax/4358/
В задаче про массив забавные условия на 7-8 строках (присвоение вместо сравнения) )
Понятно, что это просто опечатка, но собеседующая добрая (или не обратила внимание).
привет! посмотрел с интересом, в процессе накидывал решения :)
1 задачу сделал бы так:
function get(obj, chain) {
return chain?.split('.').reduce((acc, key) => acc?.[key], obj);
}
2 можно тоже в одну строку, гораздо быстрее (для достаточно длинных строк - на порядок) будет регуляркой:
function rle(input) {
return input.match(/(\w)\1*/g).reduce((acc, v) => acc += v[0] + (v.length > 1 ? v.length : ''), '');
}
3 ваше решение нерабочее по нескольким причинам: интерпретатор ругнётся на return throw (уже писали в комментах) + если после неудачной попытки будет успешная - первый Promise из call stack всё равно не будет заресолвлен. я бы реализовал так:
function get(url) {
return new Promise(async (resolve, reject) => {
let retries = 5;
while (retries) {
await fetch(url)
.then((res) => {
if (!res.ok) throw new Error(); // сюда попадёт, например, ошибка 500
resolve(res);
retries = 0;
})
.catch((e) => (retries--));
}
reject('Retry count exceeded');
});
}
4
function isMonotonic(array) {
return array.reduce((acc, value, index) => {
if (acc.result && index) {
const delta = Math.sign(value - array[index - 1]);
if (acc.sign && delta && delta != acc.sign) acc.result = false;
acc.sign = delta;
}
return acc;
}, { sign: 0, result: true }).result;
}
Ваше решение второй задачи вызывает вопросы, сложно написать такую регулярку на собесе и не ошибиться. Также мне кажется, что столь короткая запись может быть непонятна интервьюверу и это в минус пойдет.
@siberian-crystall Ваши решения конечно же гораздо лучше и самое главное - рабочие (в отличие от например, решения задачи 3 на видео).
Однако в ваших решениях 1 и 4 есть недостаток: отсутствует предварительный выход из-за использования непрерываемых массивных методов. Т.е., алгоритм в любом случае переберёт весь массив, даже если мы уже можем сделать однозначный вывод, что результат undefined или false. В задаче 4 лучше всего воспользоваться циклом с предварительным return false, а в задаче 1 - рекурсивной функцией или циклом с предварительным return void 0.
А задача 2 может быть решена ещё проще и оптимизированее:
function rle(input) {
return input.replace(/(\w)\1{1,}/g, (str, char) => char + str.length);
}
Однако отмечу, что попытка решить сложные задачи используя минимальное количество строк кода - не лучшая привычка. Код должен быть очевиден для того, кто его будет читать и пусть код будет многословен - минификаторы за вас его сожмут на этапе билда проекта.
@@EgorMoscowNeverSleep Отличное дополнение, благодарю! Всё по делу)
задачи простые. сложно походу только на собес попасть. не.. ну понятно, что простые для тех кто задрачивал leetcode.
Там ещё второй алгоритмический этап, две задачи были, также не сложные, но из-за волнения всякое может случиться…
хотите сказать что, чтобы решить первую задачу надо задрачивать литкод?
@@topsy_kreds ты уже работаешь в яндексе?
Попасть просто, стажировки яндекс напишите в поисковике и на официальном сайте найдете инструкцию
вторая задача, мое решение
function countStr(str) {
let count = 0;
let res = "";
for (let i = 0; i < str.length; i++) {
if (str[i] === str[i + 1]) {
count++;
} else if (count === 0 && str[i] !== str[i + 1]) {
res = res + str[i];
} else {
count++;
res = res + str[i] + count;
count = 0;
}
}
return res;
}
Братец, а остальные этапы писать будешь? Я про алгосекцию и платформу?
Привет, второй этап я также успешно прошел, там было две алгоритм задачки, но его к сожалению я его не записал, можешь в тг моем увидеть что за задачи там были.
Третий этап полностью разговорный, там не сильно интересно, вопросы про опыт и на софт скиллы
@@alexandrkazakov723у меня было 4 финала и на одном из них так же были задачки. на 3-х других только разговоры. Так-что от команды все-таки зависит.
@@alexandrkazakov723 Тебе предложили офер в итоге? И какая вилка была если не секрет
@@alexandrkazakov723 как найти ваш тг?
первая банальная задача.. но очень хорошо показывает опыт программиста и его харды. у вам хеш таблица и путь это ключи! какая нафиг рекурсия..😂 задача на знание js и структур данных. читайте ребят книги! они очень полезные.. кто знает как распаковать объект? вот вам и ответ на задачу. учите структуры данных!..
Устроился в итоге в компанию? Надеюсь, что да
Слишком кипишной как будто ,очень много лишних вопросов задавал ,которые не нужны ,особенно в моменте «да давай я оценю сложность алгоритма ?»😃
Сложность оценки алгоритма обязательно нужно называть на подобного рода собесах. После этого был второй алгоритмический этап, там две алгоритмические задачи было, прямо спрашивают сложность алгоритма, если ты не не говоришь. А про компании уровня фаанг я молчу.
ага ага ага ага ага ага угу угу угу угу угу угу ага ага ага ага
Третья задача:
if(counter === 5) {
throw new Error("3aдданный URL недоступен") ;
} else { ...}
return при выбрасывании ошибки не нужен (его наличие вызовет ошибку)
Четвертая задача:
function isMonotonic(numbers) {
if (numbers.length 0 && numbers[i] < numbers[i - 1]) ||
(type < 0 && numbers[i] > numbers[i - 1]) ||
(type == 0 && numbers[i] !== numbers[i - 1])
) {
return false;
}
}
return true;
}
ваше решение вернёт false для массива [1, 1, 2, 3], потому что определяет направление монотонности только по паре первых значений
@@siberian-crystallтак и должно быть
а какой результат? позвали на второй этап?
да, позвали на второй этап, там было только две задачки, уже алгоритмические, я их также решил
4 задача как вариант.
function isMonotonic(num) {
const mono1 = [...num].sort((a, b) => a - b);
const mono2 = [...num].sort((a, b) => b - a);
if (mono1.join('') === num.join('') || mono2.join('') === num.join('')) {
return true;
}
return false;
}
Вы 8 раз пробежались по массиву. Спасибо, но нам в программировании такого не нужно.
@@EgorMoscowNeverSleep Да ладно, мне не жалко
так оффер предложили по итогу?
слабо, очень много нелепых комментариев от тебя по ходу собеса, которыми себя же и зарываешь, создается впечатление, что ты не понимаешь о чем говоришь, даже если это не так. Хоть и атмосфера на собесе - "дружеская беседа", это все еще собеседование и любое твое слово будет использовать против тебя в фидбэке) удачи в обучении
@@topsy_kreds видимо комментарий мне, но я и второй раунд алгоритмическую секцию успешно прошел. И все это с первого раза, если это слабо, то что же, меня такая слабость устраивает 🙂
@@alexandrkazakov723 я так понимаю собесы были на стажировку?
@@topsy_kreds нет конечно, какая стажировка.
Так и надо. Именно рассуждения в слух на собесах и любят. Видимо с молчунами им скучно и заворачивают если конечно это не сеньор которому никакие собесы не нужны.
@@Psoglawec я не против рассуждений в слух, просто тут человек местами чепуху говорит
все это хорошо, но КАК попасть на собеседования? КААААК?
@@psevdonim257 ищи на линкедин разрабов которые работают в нужных тебе компаниях , пиши им и проси рефералку. В большинстве топ компаний есть рекомендательная реферальная система.
@@alexandrkazakov723 вариант, спасибо, сначала надо хороший впн чтоб все завелось
Это на какой уровень, джуниор или мидл?
Об этом тебе никто прямо не скажет. Могу только сказать, что на видео один из этапов с лайвкодингом.
стажировка яндекса
Типатиптатптаитипатипатипатипатипа
4)
function mon(nums) {
let isMon = true
let monType = 0
if(nums.length < 3) {
return true
}
for (let i = 1, prevNum = nums[0]; i < nums.length; i++) {
const currNum = nums[i]
if (currNum !== prevNum) {
diffSign = Math.sign(currNum - prevNum)
if (monType === 0) {
monType = diffSign
} else if (monType !== diffSign) {
isMon = false
break
}
}
prevNum = currNum
}
return isMon
}