Art of Code – Telegram
Art of Code
2.06K subscribers
49 photos
1 file
69 links
По вопросам: @vice22821

Чат: @code_of_art
Download Telegram
Задача с собеса в яндекс на бекенд, камрады!!!

Что произойёт с целыми переменными a,b после выполнения?

a ^= b ^= a ^ = b;


1) a станет равно 0?
2) a,b станут равны?
3) a,b поменяются значениями
4) b станет равно 0, а a станет равным b
5) Undef behavior
6) Unspec behavior

Решение: очевидно будет Undefined behavior. Компилятор имеет право вычислять подвыражения в любом порядке, так как их порядок не задан стандартом. Он может начать с самого левого a ^= b, с самого правого a ^= b, или с середины. Результат будет разным в каждом из этих случаев.
2
int fn(int v) {
if (v == 1 || v == 0) {
return 1;
}
if (v % 2 == 0) {
return fn(v / 2) + 2;
}
return fn(v - 1) + 3;
}

fn(7)?
Решение: Вычисление fn(7):

v = 7 (нечётное):
return fn(6) + 3

v = 6 (чётное):
return fn(3) + 2

v = 3 (нечётное):
return fn(2) + 3

v = 2 (чётное):
return fn(1) + 2

v = 1:
return 1

Теперь поднимаемся обратно по цепочке вызовов:

Шаг 5: fn(1) = 1

Шаг 4: fn(2) = fn(1) + 2 = 1 + 2 = 3

Шаг 3: fn(3) = fn(2) + 3 = 3 + 3 = 6

Шаг 2: fn(6) = fn(3) + 2 = 6 + 2 = 8

Шаг 1: fn(7) = fn(6) + 3 = 8 + 3 = 11

Ответ
fn(7) = 11
4
// Выберите самый точный вариант вычисления суммы (предполагаем, что числа только положительные)

// Вариант 1
double sum(vector<float> &v) {
return accumulate(v.begin(), v.end(), 0.0);
}

// Вариант 2
double sum(vector<float> &v) {
sort(v.begin(), v.end());
return accumulate(v.begin(), v.end(), 0.0);
}

// Вариант 3
double sum(vector<float> &v) {
sort(v.begin(), v.end(), greater<float>());
return accumulate(v.begin(), v.end(), 0.0);
}


Решение: Самый точный вариант — Вариант 2 (сортировка по возрастанию).

Объяснение:

При суммировании чисел с плавающей точкой возникает проблема потери точности из-за ограниченной мантиссы. Когда мы складываем числа сильно разного порядка, младшие разряды меньшего числа теряются.

Почему Вариант 2 самый точный:

Сортировка по возрастанию `(sort(v.begin(), v.end()))` означает, что мы начинаем суммировать с наименьших чисел

При таком подходе меньшие числа успевают накопиться до того, как будут добавлены к значительно большим числам

Это уменьшает потерю точности, так как числа одного порядка складываются сначала

Почему другие варианты хуже:

Вариант 1: Без сортировки — порядок суммирования произвольный, возможна значительная потеря точности

Вариант 3: Сортировка по убыванию — начинаем с самых больших чисел, и когда к ним добавляются очень маленькие числа, они могут быть полностью проигнорированы из-за ограниченной точности


@codeof_art
@codeof_art
@codeof_art
🔥62
Вопросы с видео интервью в Авито

1️⃣расскажите о себе

2️⃣ Расскажите, какие цели вы ставите для развития в профессии? Какие навыки и знания вы хотите приобрести, чтобы достичь этих целей?

3️⃣ Приведите пример профессионального или личного достижения.

Какие шаги были предприняты?
Оцените по 10-ти балльной шкале, насколько сложно было достигнуть данного результата?

4️⃣ Приведите пример в рамках вашей работы, учёбы или студенческих активностей, где вы работали в команде или в паре с кем-либо.

Какая задача перед вами стояла?
Как распределялись работа и ответственность внутри команды, и какие задачи выполняли непосредственно вы?

5️⃣ Как вы предпочитаете работать: в команде или индивидуально? Что для вас самое сложное в командной работе?

6️⃣ Расскажите, пожалуйста, чем вам интересно выбранное направление? Почему хотите развиваться именно в нём?

7️⃣ Почему вы решили подать заявку на стажировку для разработчиков в Авито?

8️⃣ Выделите три критерия выбора работодателя, которые являются для вас самыми важными?

9️⃣ Какую заработную плату вы бы хотели получать на программе? Ориентируйтесь на количество часов в неделю, которое вы готовы уделять стажировке.

@codeof_art
🔥42🗿1
Активно развиваем наш открытый банк собесов:
Фронтенд
Бэкенд
Алгоритмы
Аналитика
ML & DS

Уже собрали более тысячи реальных собесов/тестовых заданий. Внести свой вклад в общее дело, можно заполнив форму.
Также очень много всего интересного на нашем сайте.
2❤‍🔥2
#include <iostream>
using namespace std;

int f(int a, int b) {
if (a == 0 || b == 0) {
return a + b;
}
if (a > b) {
return f(a - b, b);
}
return f(a, b - a);
}

int main() {
cout << f(17, 257) << endl;
return 0;
}

что напечатается на экране?

Решение: оптимальнее перебора по всем случаям ничего не нашлось поэтому просто ответ: 1 по алгоритму евклида

@codeof_art
@codeof_art
@codeof_art
4🗿3
Товарищи, Поступашкам нужны контент мейкеры. Если вы творческая личность, интересующейся фронтендом, бэкендом, мобильной разработкой, дата сайнс, аналитикой, алгоритмами, вам нравится писать посты/ придумывать идеи для контента, то обязательно пишите @vice22821. Оплата сдельная, ориентировочно за один пост от 2 тыс до 15 тыс рублей.

Обязательно делитесь с ребятами, которым это может быть интересно.
3
Новогодние скидки на нашу линейку математических курсов 🎓

Хочешь поступить в ШАД, Ai Masters, или ААА? А может ты мечтаешь тащить собесы и поступить в крутую магу, но тебе не хватает фундамента? Узнал себя? Тогда записывайся у администратора на любой из курсов:

➡️ алгоритмы
➡️ теория вероятностей
➡️ линейная алгебра
➡️ математический анализ

Наши курсы заточены на практику и конкретные задачи, вся теория будет разобрана на конкретных задачах и примерах, которые будут на экзаменах и на собесах. Ничего нудного и скучного! Изучаем только то, что вам реально понадобится! Хочешь конкретики? На нашам сайте можно найти программу, подробности и отзывы на каждый курс.

Помимо кучи авторских задач мы даем доступ к уникальной закрытой базе заданий ШАДа, разбор реального контеста в ШАД, разбор ВСЕХ задач с собеседований в ШАД, Ai Masters, ААА! Более того, вы получите эксклюзивные материалы для проверяющих с собесов, пробный экзамен, инсайды, персональные рекомендации, собес с подробной консультацией и дальнейшим сопровождением вплоть до поступления в место мечты! А если вы выполните все рекомендации, но не достигнете поставленной цели, то вам вернут все потраченные деньги!

Для вопросов и покупок пишем администратору и не тянем с этим: на каждом курсе количество мест ограничено!
Please open Telegram to view this post
VIEW IN TELEGRAM
1🗿1
Задача на сравнение строк в джаве

public static void main(String[] args) {
String based1 = "Я стажёр и работаю за компот";
String based2 = "Я стажёр и работаю за компот";

String based3 = new String("Я стажёр и работаю за компот");
String based4 = new String("Я стажёр и работаю компот");
String based5 = new String("Я стажёр и работаю за компот").intern();

System.out.println(based1 == based2);
System.out.println(based1 == based3);
System.out.println(based3 == based4);
System.out.println(based4 == based5);
System.out.println(based1 == based5);
}

Что выведется на экране при сравнении этих строк?

Результат
true
false
false
false
true


Объяснение
based1 и based2 - строковые литералы одинаковы, джава помещает их в String Pool, где ссылки переменных указывают на один и тот же объект.
based3 создаётся через конструктор new => значение литерала находится в пуле, но new String() создаёт новый объект в куче, и ссылка указывает именно на этот новый объект.
based4 - ещё один новый объект в куче, отличный от based3.
based5 - применяем метод intern(), который ищет строку в пуле и возвращает ссылку на объект из пула, а не созданный через new (если не находит, то добавляет строку в пул).


Немножко о строках в java

String в джаве - неизменяемый тип. Это позволяет хранить строковые литералы в специальной области в куче - String Pool и оптимизировать память (если значение уже есть в пуле, то новое не создаётся, а возвращается ссылка на старый объект без выделения дополнительной памяти). Если же строка создаётся динамически (с помощью конструктора), то новый объект создаётся в куче в любом случае.

@codeof_art
🔥21
Т-академия

Экзамены до 22 января. Курсы для фаст трека на стажировку. Податься одновременно и на стажировку и на академию нельзя, только если с фейков. Задания уже выложены тут. Разбор алгоритмов для аналитиков и бэкендеров будет только на нашем курсе по алгоритмам, на который скидка заканчивается уже сегодня.
1
Задача на сравнение чисел в джаве

    public static void main(String[] args) {
Integer stupidNum1 = 127;
Integer stupidNum2 = 127;
Integer stupidNum3 = Integer.parseInt("127");
Integer stupidNum4 = 128;
Integer stupidNum5 = 128;
Integer stupidNum6 = -129;
Integer stupidNum7 = -129;

System.out.println(stupidNum1 == stupidNum2);
System.out.println(stupidNum1 == stupidNum3);
System.out.println(stupidNum4 == stupidNum5);
System.out.println(stupidNum6 == stupidNum7);
}

Что будет выведено на экран при сравнении этих чисел?

Результат:
true
true
false
false


Объяснение:
В джаве значения в диапазоне от -128 до 127 включительно хранятся в Integer кэше.
Если инициализируется переменная со значением в указанном диапазоне, объект из кэша будет использован повторно => одна и та же ссылка на один и тот же объект.
Если значение не входит в диапазон, создаётся новый объект в куче, и при проверке на равенство через "==" сравниваться будут ссылки на разные объекты.
При создании значения через parseInt(): возвращается примитив int -> автоупаковка в Integer -> генерация вызова valueOf(), который проверяет, находится ли значение в диапазоне кэша, и либо возвращает кэшированный объект, либо создаёт новый объект типа Integer.

В общем, помните об этом, но сравнивайте числа через equals(), чтобы не заморачиваться.


@codeof_art
4🔥4🤩1
Задача на resize() хэшмапы в джаве

    public static void main(String[] args) {
Map<Integer, String> internMap = new HashMap<>(5);

internMap.put(1, "salary");
internMap.put(2, "?");
internMap.put(3, "thanks,");
internMap.put(4, "I");
internMap.put(5, "work");
internMap.put(6, "for");
internMap.put(7, "compote");

System.out.println("key 1 = " + internMap.get(1));
System.out.println("size = " + internMap.size());
}


При добавлении какого элемента произойдёт resize()?

Результат:
Ресайз произойдёт при добавлении 7-ого элемента, все элементы перераспределятся, ёмкость хэшмапы увеличится с 8 до 16.

Объяснение:
При создании хэшмапы с параметром 5 ёмкость на самом деле = 8, так как приводится к ближайшей степени двойки.
Предельное количество элементов высчитывается именно от реальной ёмкости и в джаве по умолчанию равняется 75% от заполненности => 8 * 0,75 = 6. Ресайз произойдёт на 7 элементе, когда предельное количество станет превышено.
Для 7 элементов это не критично, но в условиях больших данных ресайзы необходимо избегать, так как они замедляют хэшмапу во время перераспределения бакетов.


Стандартный способ расчёта ёмкости, если мы в курсе предполагаемого количества элементов:
int expectedElements = 1000;
int safeCapacity = (int) Math.ceil(expectedElements / 0.75) + 1;
Map<K, V> anotherStupidMap = new HashMap<>(safeCapacity);


@codeof_art
2