Компания: Яндекс (первый этап)
Были только задачи, экран не шарил, немного помогали.
1. Что выведет в консоль и почему?
Первая задача
var n = 5
function fn(n) {
n = 10
}
fn(n)
console.log(n) //???
Ответ: 5
Вторая задача
var obj = { a : 1}
function fn(obj) {
obj = { c : 5}
}
fn(obj)
console.log(obj) //???
Ответ: { a : 1}
Третья задача
var obj = { a : 5}
function fn(obj) {
obj.c = 10
}
fn(obj)
console.log(obj) //???
Ответ: { a : 5, c : 10 }
2. onceFn — Написать функцию которая вызывается только один раз
function onceFn(fn) {
//Code here
}
function log(value) {
console.log(value)
}
const onceLog = onceFn(log)
onceLog('1') // Выведет 1
onceLog('2') // Вернёт undefined
onceLog('3') // Вернёт undefined
const onceLog2 = onceFn(log)
onceLog2('4') // Выведет 4
onceLog2('5') // Вернёт undefined
onceLog2('6') // Вернёт undefined
Решение:
function onceFn(fn) {
let isCall = false
return (...args) => {
if (!isCall) {
isCall = true
return fn(...args)
}
};
}
//P.S.(можно сделать с привязкой контекста):
3. Написать полифил для groupBy у массивов
Array.prototype.groupBy
Решение:
Array.prototype.groupBy = function (callback) {
const result = {}
for (let i = 0; i < this.length; i++) {
const key = callback(this[i])
if (!result[key]) result[key] = []
result[key].push(this[i])
}
return result
}
const arr = [ 1, 2, 3, 4, 5 ]
const grouped = arr.groupBy((num) => num % 2 === 0 ? 'even' : 'odd')
console.log(grouped)
// P.S. Можно написать более продвинутое решение с дополнительными проверками и передачей доп. аргументов в callback
4. Функция Auth должная вернуть промис после выполнения callback в asyncAuth c error (rejected) либо data (fullfiled)
import asyncAuth from 'lib/auth'
function Auth() {
asyncAuth((error, data) => {
//Code here
})
}
Решение:
function Auth() {
return new Promise((resolve, reject) => {
asyncAuth((error, data) => {
if (error) {
reject(error);
} else {
resolve(data);
}
});
});
}
5. Задача немного связанная с предыдущей Auth.
Реализовать функцию которая будет вызывать попытки авторизации
Решение:
function auth(count = 5) {
return new Promise(() => {
function tryAuth(count) {
Auth.then((value) => {
resolve(value)
}).catch((error) => {
if (count === 0) {
reject(error)
} else {
tryAuth(url, count - 1)
}
})
}
tryAuth(5)
})
}
6. Сложить числа из массива
Дан массив [1, [2, '2x', 3], ['5', ['x7', ['6', '4']]]]
Нужно сложить все числа массива.
Если попадается число на подобии '2x' считать его как 2
Если 'x7', то игнорировать
P.S. Методы flat и flatMap нельзя использовать
Решение 1 (постое, думаю бы приняли его):
function flattenSum(arr) {
let sum = 0
for (let i = 0; i < arr.length; i++) {
const el = arr[i]
if (Array.isArray(el)) {
sum += flattenSum(el)
} else {
sum += parseFloat(el) || 0
}
}
return sum
}
Решение более сложное (написал его):
function helper(num) {
return parseFloat(num) || 0
}
function flattenSum(arr) {
const stack = [ arr ]
let sum = 0
while (stack.length > 0) {
const pop = stack.pop()
if (Array.isArray(pop)) {
stack.push(...pop)
} else {
sum += helper(pop)
}
}
return sum
}
console.log(flattenSum([ 1, [ 2, '2x', 3 ], [ '5', [ 'x7', [ '6', '4' ] ] ] ]))
7. Задача MaxStack — это классическая задача, которая требует реализации структуры данных, похожей на стек, но с дополнительной функциональностью: она должна поддерживать не только стандартные операции стека (push, pop), но и операцию быстрого получения максимального элемента в стеке.
Формулировка задачи:
Реализуйте структуру данных MaxStack, которая поддерживает следующие операции:
push(x) — добавляет элемент x в стек.
pop() — удаляет и возвращает верхний элемент стека.
top() — возвращает верхний элемент стека без его удаления.
getMax() — возвращает максимальный элемент в стеке.
Все операции должны выполняться за O(1) время.
Решение которое написал не помню, но примерно такое-же:
Deepseek: vvv
class MaxStack {
constructor() {
this.stack = []; // Основной стек
this.maxStack = []; // Вспомогательный стек для хранения максимумов
}
// Добавление элемента в стек
push(x) {
this.stack.push(x);
// Если maxStack пуст или x >= текущего максимума, добавляем x в maxStack
if (this.maxStack.length === 0 || x >= this.maxStack[this.maxStack.length - 1]) {
this.maxStack.push(x);
}
}
// Удаление и возврат верхнего элемента
pop() {
if (this.stack.length === 0) {
throw new Error("Stack is empty");
}
const popped = this.stack.pop();
// Если удалённый элемент равен текущему максимуму, удаляем его из maxStack
if (popped === this.maxStack[this.maxStack.length - 1]) {
this.maxStack.pop();
}
return popped;
}
// Возврат верхнего элемента без удаления
top() {
if (this.stack.length === 0) {
throw new Error("Stack is empty");
}
return this.stack[this.stack.length - 1];
}
// Возврат максимального элемента
getMax() {
if (this.maxStack.length === 0) {
throw new Error("Stack is empty");
}
return this.maxStack[this.maxStack.length - 1];
}
}
// Пример использования:
const maxStack = new MaxStack();
maxStack.push(3);
maxStack.push(5);
maxStack.push(2);
console.log(maxStack.getMax()); // 5
maxStack.pop();
console.log(maxStack.top()); // 5
console.log(maxStack.getMax()); // 5
maxStack.push(6);
console.log(maxStack.getMax()); // 6