Как може да се оптимизира алгоритъмът за пресичане?
Frontend
Какво ви харесва и какво не ви харесва в работата ви в компанията?
/** * Реализирайте метода times за числов обект. * Функцията трябва да приема callback и да го извиква * определен брой пъти с индекса на текущата итерация. */ Number.prototype.times = function (callback) { const n = Number(this); for (let i = 0; i < n; i++) { callback(i); } } // Примери console.clear(); (3).times(console.log) // 0 // 1 // 2
Има дърво, на което седят катерички и врани. Необходимо е да напишем функция, която намира всички катерички на дървото и връща техните имена. Очакван резултат: ['Acorn', 'Sirsalty', 'Macadamia', 'Kernel'].
Колко време работите в компанията?
/** * Трябва да напишете функция strjoin, * която свързва низове чрез разделител. */ function strjoin() { // код тук } console.log(strjoin('a', 'b', 'c')) // 'a.b.c' console.log(strjoin('a', 'b', 'c', 'd', 'e', 'f')) // 'a-b-c-d-e-f'
/* Дадени са два сортирани списъка с интервали на присъствие на потребители онлайн през деня. Началото на интервала е строго по-малко от края. Трябва да изчислите интервалите, когато и двамата потребители са били онлайн. Интервалите са посочени в часове, като се счита, че могат да варират от 0 до 24. */ пресичане( [[8, 12], [17, 22]], [[5, 11], [14, 18], [20, 23]] )// [[8, 11], [17, 18], [20, 22]] пресичане( [[9, 15], [18, 21]], [[10, 14], [21, 22]] )// [[10, 14]] function пресичане(потребител1, потребител2) { // напишете вашия код тук }
Пренапишете функцията strjoin без използване на rest-параметри, използвайки вместо тях обекта arguments.
/* Три секции код са дадени. Трябва да напишете резултата от всяко console.log. */ var n = 1; function f(n) { n = 3; } f(n); console.log(n); // ?? // ---------------- var obj = { a: 1 }; function f1(o) { o.a = 5; } f1(obj); console.log(obj); // ?? // ---------------- var obj = { a: 1 }; function f2(o) { o = { hello: 1 }; } f2(obj);
Как ще се променят асимптотичната сложност и потреблението на памет в задачата camelCase → snake_case, ако резултатът се събира чрез конкатенация на низове вместо масив от символи?
Реализирайте метода Array.prototype.groupBy, който връща структурирана версия на масива от обекти, където всеки ключ е резултатът от извикването на предадената функция, а стойността е масив от елементи, съответстващи на този ключ.
// Необходимо да реализирате метода groupBy, който разширява стандартните методи на масивите. // Методът трябва да връща групирана версия на масива - обект, // в който всяка ключ е резултатът от изпълнението на предадената функция fn(arr[i]), // а всяка стойност е масив, съдържащ всички елементи на оригиналния масив с този ключ. // код тук // Пример 1 const array1 = [ { id: 1 }, { id: 1 }, { id: 2 } ]; const fn = (item) => item.id; console.log(array1.groupBy(fn)); // { // 1: [{ id: 1 }, { id : 1 }], // 2: [{ id: 2 }] // } // Пример 2 const array2 = [1, 2, 3]; console.log(array2.groupBy(String)); // { // "1": [1], // "2": [2], // "3": [3] // } // Пример 3 const array3 = [3.3, 0.5, 1.4]; console.log(array3.groupBy(Math.round)); // { // 3: [3.3], // 1: [0.5, 1.4] // }
Защо for...of е подчертана в червено в TypeScript, а обикновеният for не е?
Напишете функция tries(n), която извиква функцията aus до n пъти: връща първия успешен резултат, а ако всички опити завършат с грешка — хвърля последната грешка.
// Получавате низ, съставен от латински букви, интервали и знаци за пунктуация. // Низът се нарича панограма, ако съдържа поне веднъж всяка от 26-те букви. Определете дали низът е панограма. const LETTERS = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']; function isPangram(text) { // вашият код тук } console.log(isPangram(`A pangram or holoalphabetic sentence is a using every letter of a given alphabet at least once.`)); // => console.log(isPangram('Waltz, bad nymph, for quick jigs vex.'))
В прототип на рекламна мрежа продажбата на рекламни места работи по следния начин: купувачите предварително посочват цената си, а за всяко рекламно място отговарят дали са готови да го купят или не. Необходимо е да се реализира функция, която преди продажбата на рекламното място ще изчака съгласието или отказа на купувачите с най-висока цена, а след това ще продаде рекламното място на купувача с най-висока цена сред тези, които са се съгласили. Отговорът на функцията трябва да бъде възможно най-бързо. Трябва да върнете индекса на купувача. Примери: Купувачите предлагат цени 1, 5, 10 Купувачът с предложение 10 отказа Купувачът с предложение 1 се съгласи // Все още чакаме, тъй като може да отговори купувачът с цена 5 Купувачът с предложение 5 се съгласи // Избираме купувача с предложение 5 ------------ Купувачите предлагат цени 1, 5, 10 Купувачът с предложение 10 отказа Купувачът с предложение 5 се съгласи // Не чакаме повече отговор от купувача с предложение 1 - той със сигурност няма да бъде избран ------------ Купувачите предлагат цени 1, 2 Купувачът с предложение 1 отказа Купувачът с предложение 2 отказа // Не избираме никого interface Buyer { price: number; accepts: () => Promise<boolean>; } async function bestBuyer(buyers) { const sorted = buyers.map((buyer, index) => ({buyer, index})).sort((a, b) => a.buyer.price - b.buyer.price); const promise = sorted.map(({buyer}) => buyer.accepts()); for (let i = 0; i < sorted.length; i++) { const accepted = await promise[i]; if (accepted) { return sorted[i].index; } } if (await buyers[0].accepts()) { return 0; } return -1; }
Защо не може да се използва стрелкова функция за groupBy? Какво ще бъде this в стрелката?
// всяка стойност е масив, съдържащ всички елементи на оригиналния масив с този ключ. // код тук // Пример 1 const array1 = [ { id: 1 }, { id: 1 }, { id: 2 } ]; const fn = (item) => item.id; console.log(array1.groupBy(fn)); // { // 1: [{ id: 1 }, { id: 1 }], // 2: [{ id: 2 }] // } // Пример 2 const array2 = [1, 2, 3]; console.log(array2.groupBy(String));
Какви ограничения има рекурсивното обхождане на дърво? Как се различава обхождането в дълбочина (DFS) от обхождането в ширина (BFS)? Как може да се реализира обхождане на дърво без рекурсия?
/* Необходимо да реализирате метода intersection, който разширява стандартните методи на множествата (Set). Методът приема друго множество като аргумент и връща ново множество, което е пресечението на първоначалното и подаденото множество, т.е. съдържа само елементите, които присъстват и в двете множества. */ // вашият код const set1 = new Set([1, 2, 3, 4]); const set2 = new Set([3, 4, 5, 6, 7, 8]); console.log(...set1.intersection(set2)) // 3 4 --- Set.prototype.intersection = function (set2) { const result = new Set(); for(const value of this) { if (set2.has(value)) result.add(value); } return result; } const set1 = new Set([1, 2, 3, 4]); const set2 = new Set([3, 4, 5, 6, 7, 8]); console.log(...set1.intersection(set2)) // 3 4