Задачи с собеседований😎
155 subscribers
169 photos
16 videos
2 files
386 links
Всем привет!

Будем сюда выкладывать реальные задачи и вопросы с собеседований

@privatevoidmain - по всем вопросам

Еще больше задач с собеседований на нашем основном канале - https://t.me/+SlsR25MJs_1iYTcy
Download Telegram
unknown company #unknown

Небольшая контора предложила решить такую задачу на собесе

1. Метод должен принять на вход путь к локальному файлу в формате xlsx и число N
2. В файле в столбик находятся целые числа
3. Метод должен вернуть N-ное минимальное число из файла
4. Для поиска нельзя использовать библиотечные функции типа сортировки массива, нужно предложить и реализовать эффективный алгоритм (это важно)

Прислать задачу | Подписаться
1
Яндекс

Вы — backend-разработчик в интернет-магазинеВы — backend-разработчик в интернет-магазине.
Дела идут в гору и магазин ре
WB #repeat(была подобная задача, но не вб)
Есть матрица n на m. 1-суша, 0-вода. Нужно сосчитать кол-во островов.
Остров - это произвольный фрагмент суши, не соединенный с другими участками суши.
Связь по диагонали - не считается. Все, что за пределами матрицы - вода

Example 1:

Input: grid = [
["1", "1", "1", "1", "0"],
["1", "1", "0", "1", "0"],
["1", "1", "0", "0", "0"],
["0", "0", "0", "0", "0"]
]

Output: 1

Example 2:

Input: grid = [
["1", "1", "0", "0", "0"],
["1", "1", "0", "0", "0"],
["0", "0", "1", "0", "0"],
["0", "0", "0", "1", "1"]
]

Output: 3

#wilberries
Прислать задачу | Подписаться
Озон #sql

### Есть две таблицы
- tab1
id
1
2
3

- tab2
id
1
1
2
2

Скажите количество строк в результирующей таблице при
1. inner join
2. left join
3. cross join


#ozon
Прислать задачу | Подписаться
Озон

Реализовать свой перечислимый тип (enum), как если бы до появления современного enum в Java 1.5.

Нужно реализовать контракт современного Java-enum:
- можно легко получать любое значение энума
- безопасное сравнение значений по ссылке (==)
- каждое значение имеет строковое имя, совпадающее с названием значения
- каждое значение имеет целочисленный идентификатор ordinal, который содержит номер значения в порядке его объявления в энуме
- можно получить список всех значений энума
- можно получить значение по его ordinal
- можно получить значение по его имени

Для примера можно взять список валют. Важно, чтобы список был потенциально расширяемым, потому что качество кода будет определять, насколько беспроблемно в будущем пройдет добавление значений в энум.

class Currency {
// TODO
}

// Currency.USD == Currency.USD true


#ozon
Прислать задачу | Подписаться
Озон
interface Cache {
// Метод для обновления каша через мутацию
void bulkUpdate(Updater updater);
// Метод, который принимает индексы для чтения
long[] bulkRead(int[] indices);
}

// Интерфейс, через который пользователи каша обновляют его
interface Updater {
void updateCurrentState(long[] currentCacheState);
}

public void main() {
var cache = new SimpleCache();
cache.bulkUpdate(arr -> { arr[0] = 123; arr[1] = 456; });
var cacheValues = cache.bulkRead(new int[]{1, 2});
System.out.println(Arrays.toString(cacheValues));
}


Нужно реализовать "кэш", который хранит лонги по индексу. Размер кэша - 10 элементов.
Реализует два метода: void bulkUpdate(Updater updater) и long[] bulkRead(int[] indices).
bulkUpdate обновляет значения пачкой в текущем состоянии кэша, in-place.
bulkRead получает пачкой необходимые лонги из кэша по индексам.

Условия:
- Есть N (константа) потоков которые кэш читают.
- Есть 1 поток, который кэш обновляет.
- Читатель должен быть защищён от dirty-read. То есть, если происходит мутация A -> B, то читатель должен видеть только конечное состояние (A или B), но никогда промежуточное.
- Чтение должно быть неблокирующим.
- Запись может быть блокирующей.
- Входные данные можно считать всегда валидными (не null; индексы только от 0 до 9 включительно).


#ozon
Прислать задачу | Подписаться
Тбанк

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

На вход получаем k — минимальную продолжительность отпуска, на который согласен Изосим, и список дней в виде массива из чисел 0 (релиза не будет) и 1 (запланирован релиз).

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

findDayoffs(2, [0,0,1,0,0]) -> 2
findDayoffs(1, [0,0,1,0]) -> 4 // Три варианта продолжительностью 1 день и один вариант 2 дня
findDayoffs(3, [0,0,1,0,0]) -> 0

#include <stdio.h>
int main(void)
{
printf("Hello, world!");
return 0;
}

#tbank
Прислать задачу | Подписаться
Лига цифорвой экономики

Описание задачи и код по ссылке -
online-ide.com/rmF4kxy7d8
#digitalleague | Подписаться
Тбанк

// Необходимо написать функцию, которая получает строку с абсолютным UNIX-путем и возвращает укороченную версию, удаляя все ненужное:
// Input: "/foo/../test/../foo//bar/./baz"
// Output: "/foo/bar/baz"

// Обозначения:
// .. - возврат на директорию выше
// . - текущая директория (по сути, просто мусор)
// // - просто мусор
// Вне корневой директории выйти нельзя

#tbank
Прислать задачу | Подписаться
Тбанк

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


//Отработает ли CountDownLatch нужное количество раз?
public class Increment {
private static int counter1 = 0;
private static int counter2 = 0;
Lock lock = new ReentranLock();

public static void main(String[] args) throws InterruptedException {
int tasksCount = 100_000;
CountDownLatch latch = new CountDownLatch(tasksCount);
ExecutorService executor = Executors.newFixedThreadPool(100);

for (int i = 0; i < tasksCount; i++) {
executor.submit(() -> {
counter1++;
counter2++;
latch.countDown();
});
}

latch.await();
//сколько будет выведено?
System.out.println(counter1);
System.out.println(counter2);
System.exit(0);
}
}

#tbank #repeat
Прислать задачу | Подписаться
Газпромбанк

Из исходного списка стран получить страну у которой будет максимальное значение отношения популяции к площади
import java.util.*;

class Scratch {

public static void main(String[] args) {
List<Country> countries = Arrays.asList(new Country("country_1", 100, 5000),
new Country("country_2", 9000, 500000),
new Country("country_8", 6527, 6324687),
new Country("country_11", 872321, 765237),
new Country("country_9", 823743, 63543762),
new Country("country_3", 800, 40000));

Country c = getTheBiggestCountry(countries);
System.out.println(c);
}

public static Country getTheBiggestCountry(List<Country> countries) {
// из исходного списка стран получить страну у которой будет максимальное значение отношения популяции к площади
return null;
}

static class Country {

public final String name;
public final double area;
public final long population;

public String getName() {
return name;
}

public double getArea() {
return area;
}

public long getPopulation() {
return population;
}

public Country(String name, double area, long population) {
this.name = name;
this.area = area;
this.population = population;
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Country)) {
return false;
}
Country country = (Country) o;
return Double.compare(country.area, area) == 0 && population == country.population && name.equals(country.name);
}

@Override
public int hashCode() {
return Objects.hash(name, area, population);
}

@Override
public String toString() {
return "Country{" +
"name='" + name + '\'' +
", area=" + area +
", population=" + population +
'}';
}
}
}

#gazprombank
Прислать задачу | Подписаться
Яндекс
Компания предоставляет сервис массовой рассылки уведомлений для других бизнесов.
К вам обратился product owner с задачей создать систему фильтрации уведомлений с учетом предпочтений пользователей.

## Определения

Уведомление:
- id уведомления
- тип уведомления (EMAIL, SMS, PUSH)
- получатель (id пользователя)
- текст сообщения

Получатель может иметь настройки предпочтений:
- разрешенные каналы уведомлений (список типов)
- заблокированные отправители (список id отправителей)

История отправленных уведомлений:
- список уведомлений, отправленных пользователю

## Важно
Настройки пользователей и история уведомлений предоставляются другими компонентами системы.
Вам необходимо спроектировать контракты для получения этих данных.
Реализацию хранения делать не нужно.

## Задача
Написать систему фильтрации уведомлений, которая:
- на вход получает список уведомлений для фильтрации и id отправителя
- исключает уведомления, не соответствующие предпочтениям получателя
- предотвращает повторную отправку: если уведомление с таким же id уже было отправлено конкретному пользователю за последние 24 часа,
оно не должно быть отправлено снова (защита от дублирования)
- возвращает отфильтрованный список уведомлений, готовых к отправке.

Отправка уведомлений не входит в вашу задачу - другая команда займется отправкой отфильтрованного списка.
Ваша задача - только фильтрация.

#yandex
Прислать задачу | Подписаться
BetweenExchange

Реализуйте класс CustomLinkedList, который будет работать по принципу очереди (FIFO - First In, First Out). методы push() и pop()

public class CustomLinkedList<T> {

// Push - добавление нового элемента
public void push(T data) {

}

// Pop - Удаляет и возвращает элемент из очереди
public T pop() {

}

class Node<T> {
}

Прислать задачу | Подписаться
Сбер

Задача на подсчет частоты чисел (Доп задание, отсортировать по значениям)
public static void main(String[] args) {
List<Integer> list = List.of(1, 2, 3, 1, null, 2, 1, null, 3);
System.out.println("Частоты: " + countNumberFrequency(list));
}

//Java 8
public static Map<Integer, Integer> countNumberFrequency(List<Integer> numbers) {
// todo
return null;
}

#sber
Прислать задачу | Подписаться
Сбер

Написать метод, который принимает массив целых чисел и число target и возвращает элемент, наиболее близкий к target по модулю


#sber
Прислать задачу | Подписаться
Сбер
import java.util.*;

public class Main {
public static void main(String[] args) {
System.out.println(multiply(3, 4) + ", Ожидается 12");
System.out.println(multiply(-2, 3) + ", Ожидается -6"); // Ожидается -6
System.out.println(multiply(2, -3) + ", Ожидается -6"); // Ожидается -6
System.out.println(multiply(-3, -4) + ", Ожидается 12"); // Ожидается 12
System.out.println(multiply(1, 0) + ", Ожидается 0"); // Ожидается 0
System.out.println(multiply(0, 0) + ", Ожидается 0"); // Ожидается 0
System.out.println(multiply(0, 5) + ", Ожидается 0"); // Ожидается 0
System.out.println(multiply(Integer.MAX_VALUE, 1) + ", Ожидается " + Integer.MAX_VALUE); // Проверка на максимальное значение
System.out.println(multiply(Integer.MIN_VALUE, -1) + ", Ожидается " + Integer.MIN_VALUE); // Проверка на минимальное значение
}

public static int multiply(int a, int b) {
//TODO Реализовать умножение без использования операнда умножения
return a*b; //это для компиляции


}
}

#sber
Прислать задачу | Подписаться
WB

1. Сделать ревью
2. Что будет если упадет сеть в строке "//упала сеть" (и что делать)
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

import java.util.List;
import java.util.Map;

@Component
public class InterviewService {

private final ScoreRepository scoreRepository;
private final TransactionTemplate transactionTemplate;
private final InterviewScoreMLService interviewScoreMLService;
private final ObjectMapper objectMapper = new ObjectMapper();

public InterviewService(ScoreRepository scoreRepository,
TransactionTemplate transactionTemplate,
InterviewScoreMLService interviewScoreMLService) {
this.scoreRepository = scoreRepository;
this.transactionTemplate = transactionTemplate;
this.interviewScoreMLService = interviewScoreMLService;
}

    /**
     * Метод считает сколько очков заработал кандидат,
     * сохраняет результат в базу и кидает callback об этом во внешний сервис
     */
public void process(Candidate c) {
transactionTemplate.executeWithoutResult(status -> {
Score s = interviewScoreMLService.compute(c);
String body = objectMapper.writeValueAsString(Map.of(c.getName(), s));

Mono<ResponseEntity<Void>> request = WebClient.create()
.post()
.body(BodyInserters.fromValue(body))
.retrieve()
.toBodilessEntity();

scoreRepository.saveScore(s);
});
//упала сеть
}
}

class Candidate {
private final String name;
private final List<Integer> tasksSolvedId;

public Candidate(String name, List<Integer> tasksSolvedId) {
this.name = name;
this.tasksSolvedId = tasksSolvedId;
}

public String getName() {
return name;
}

public List<Integer> getTasksSolvedId() {
return tasksSolvedId;
}
}

class Score {
private final String name;
private final int score;

public Score(String name, int score) {
this.name = name;
this.score = score;
}

public String getName() {
return name;
}

public int getScore() {
return score;
}
}

#wilberries
Прислать задачу | Подписаться
Иннотех, втб

Объяснить, что здесь происходит (#repeat)
@Component
public class SomeServiceWithTransactional {

@Transactional
public void someMethod() {
// some logic
someMethod1();
}

@Transactional(propagation = REQUIRED_NEW)
public void someMethod1() {
// some logic
someMethod2();
}

@Transactional(propagation = REQUIRED_NEW)
private void someMethod2() {
...
}
}

#innotech | Прислать задачу | Подписаться
WB (не точно)
/**
* Интерфейс для взаимодействия с аппаратной частью банкомата.
*/
interface Hardware {
/**
* Возвращает массив с количеством купюр по номиналам 50, 100, 500, 1000, 5000.
* Метод работает медленно и создает шум.
*
* @return массив, где каждый элемент соответствует количеству купюр определенного номинала.
* Например, [10, 20, 30, 40, 50] означает:
* - 10 купюр номиналом 50 рублей
* - 20 купюр номиналом 100 рублей
* - 30 купюр номиналом 500 рублей
* - 40 купюр номиналом 1000 рублей
* - 50 купюр номиналом 5000 рублей
*/
fun billsCounts(): IntArray

/**
* Загружает в бокс выдачи указанные купюры.
*
* @param billsCounts массив с количеством купюр по номиналам [50, 100, 500, 1000, 5000].
* Например, [0, 1, 0, 2, 0] означает:
* - 0 купюр номиналом 50 рублей
* - 1 купюру номиналом 100 рублей
* - 0 купюр номиналом 500 рублей
* - 2 купюры номиналом 1000 рублей
* - 0 купюр номиналом 5000 рублей
*/
fun giveBills(billsCounts: IntArray)
}

/**
* Класс для реализации логики работы банкомата.
* Тут нужно писать код
*/
class MyATM {
/**
* Аппаратная часть банкомата.
*/
var hardware: Hardware? = null
val nominals = [50, 100, 500, 1000, 5000]

fun calcTotal(): Int

fun giveMoney(req: OperationRequest): OperationResponse


data class OperationRequest(val sum: Int)

data class OperationResponse(val status: OperationStatus)
}

#wilberries
Прислать задачу | Подписаться
MerlionTech

Что будет выведено?
public class ExceptionTask {
public static void main(String[] args) {
testException();
}

public static void testException() {
try {
throw new RuntimeException("Main Exception");
} catch (RuntimeException e) {
System.out.println("RuntimeException: " + e.getMessage());
} catch (Exception e) {
System.out.println("Exception: " + e.getMessage());
} finally {
System.out.println("Inside finally");
}
}
}

Прислать задачу | Подписаться