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

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

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

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

Есть таблица Person(name, age).
1. Написать запрос, который выведет имена и максимальный возраст для каждого имени
2. SQL вывести дубликаты по name+age
3.Реализовать метод List<Person> getTopAgeForName(List<Person> persons), который повторяет логику из первой задачи

Прислать задачу | Подписаться
Сбер страхование
//что не так в таком api?
//что если мы захотим расширить профиль, добавляя еще какой-то тип документа, как будем это делать?

GET https://hr-test.ru/api/user-profile/8001

Auth Type: Bearer Token

Response
{
"error": null,
"data": {
"id": 8001,
"FIO": "John Doe",
"seriesNumber": 4352 479893
}
}

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

Какая сложность у этого цикла?
for (int i = 0; i < n; ++i) {
for (int j = 1; j < n; j *= 2) {
//something
}
}

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

Написать без спринга и с юнитами (за час)
/*
Вы — backend-разработчик в финтех компании.
Компания предоставляет платежные услуги и должна контролировать лимиты пользователей.
Product owner просит создать систему проверки лимитов перед проведением платежей.

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

Платеж:
- id пользователя
- сумма (в рублях с копейками)
- тип операции (только списание)
- время операции

Лимиты пользователя:
- суточный лимит по сумме (за 24 часа)
- максимальный размер одной операции

История операций:
- список совершенных платежей пользователя

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

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

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

## Ограничения
В рамках данной задачи считаем, что все платежи одного пользователя происходят строго последовательно.
Во время проверки лимита не может быть проведен платеж того же пользователя.
*/
class PaymentsChecker {


public ??? checkPayment(??? payment) {
Написать систему проверки лимитов, которая:
- на вход получает платеж
- проверяет лимиты
- возвращает результат проверки: можно ли провести операцию
- если нельзя, то указывает причину (какой именно лимит будет превышен)
// TODO implement
}
}

interface PaymentsHistoryService {

// TODO any functions
}

interface UserLimitsService {

// TODO any functions
}

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

Описать как такое будет работать от этапа что код написан до его выполнения на процессоре. Описать как можно данный код выполнить.
Что такое интерпретаторы? Какие бывают? Что такое JIT и GraalVM?
public class MainClass {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}

Прислать задачу | Подписаться
Тбанк (стажировка)

/*
* Дана строка s, которая содержит только цифры от 0 до 9,
* в которой не все элементы равны 0.
* Нужно переставить в ней цифры таким образом, чтобы число,
* которое представляет данная строка, было минимально возможным,
* а также чтобы в этой строке не было ведущих нулей.
*
* Число содержит ведущие нули, если число не равно нулю,
* но при этом в начале числа стоит цифра 0.
* Так, например, числа 01, 0303 содержат ведущие нули,
* тогда как 0, 30000 нет.
*
* Входные данные:
* Строка s, где 1 <= |s| <= 9
* Гарантируется, что в строке есть элемент, отличный от 0.
*
* Выходные данные:
* Строка — минимально возможное число без ведущих нулей.
*
* Примеры:
* "682902" -> "202689"
* "01" -> "10"
*/
public static String solve(String s) {
// TODO
}


#tbank
Прислать задачу | Подписаться
Тбанк (стажировка)
/*
* Дана строка s, состоящая только из латинских строчных букв.
* Назовем строку хорошей, если в ней в качестве подстроки
* будут встречаться как строка "tbank", так и строка "study".
*
* Найти минимальное количество символов нужно поменять в строке,
* чтобы получившаяся строка стала хорошей.
*
* Входные данные:
* Строка s, где 10 <= |s| <= 10^5
* Гарантировано, что строка содержит только строчные буквы латинского алфавита.
*
* Выходные данные:
* Одно число — минимальное количество символов нужно заменить
* в старой строке так, чтобы встречались как подстрока "tbank", так и "study".
*
* Примеры:
* "tbankstudy" -> 0 (уже содержит обе подстроки)
* "studtbankk" -> 5 (нужно поменять 5 символов)
*/
public static int solve(String s) {
// TODO
}

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

@Service
class A {
@Autowired
private B b;

// исходный вызов приходит сюда
@Transactional
public void doA() {
// some work with BD A

try {
b.doB();
} catch (Exception ex) {
// just log
}
}
}

@Service
class B {

@Transactional
public void doB() {
// some work with DB

if (true) { // some operation with exception
throw new IllegalStateException();
}
}
}

// Вопрос: Какие изменения окажутся в БД:
// 1. A and B
// 2. A
// 3. B
// 4. nothing
Сбер

Сделать удаление элементов из списка, начиная с 3 повторений

// Input: ['A', 'B', 'A', 'B', 'A', 'B', 'C', 'C', 'D', 'C', 'C']
// Output: [A, B, A, B, C, C, D]
List<Character> removeDuplicates(List<Character> elements);

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

/**

Постамат - автоматическая станция приёма/выдачи посылок.
В маркете формируются заказы, и хочется добавить возможность получения через постамат.
Запускаем MVP: небольшая аудитория пользователей, несколько постаматов в Москве.
При заказе пользователь сможет выбрать, что хочет получить заказ в постамате.
<p>
В рамках задачи нужно реализовать код для MVP решения:
курьер привозит заказ и пробует положить его в ячейку, указывая номер заказа. Постамат сам выбирает ячейку и возвращает в ответ. Она откроется вызывающим этот метод кодом.
после того, как заказ положили в ячейку, пользователю отправляется СМС c кодом получения. Заказ будет ждать вечно
-
<p>
пользователь может получить заказ по коду выдачи из СМС. При вводе кода выдачи постамат должен вывести на экран текст "ваш заказ ХХХ в ячейке YYY", ячейка откроется сама.
<p>
Ограничения:
все ячейки одного размера, но их может быть разное количество, зависит от конкретного постамата
один заказ - одна коробка, она влезает в ячейку
ячейки каждого постамата пронумерованы
каждый постамат сам хранит своё состояние
<p>
Для отправки сообщения пользователю надо использовать клиент UserNotificationApi.*/
class PostalBox {
private final UserNotificationApi notificationApi;

public int placeOrder(Long orderId) {
}

public getOrder(Integer receiveCode) {
}
/**

Синхронный клиент, вызывающий postalbox.notify.market.yandex.net
Реализацию интерфейса описывать не нужно.*/
interface UserNotificationApi {
// нужно описать метод(ы) для отправки сообщения с кодом выдачи

boolean sendNotification(Long orderId, Integer code);


}

#yandex
Прислать задачу | Подписаться
Сбер
// Input: ['A', 'B', 'A', 'B', 'A', 'B', 'C', 'C', 'D', 'C', 'C']
// Output: [A, B, A, B, C, C, D]
//Удаление элементов из списка, начиная с 3 повторения

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


Что выведет код?
Запустится ли он?
Что такое CountDownLatch?
Как решить проблему в этом коде? Предложить несколько вариантов и реализовать каждый.
public class Application {

private static int counter1 = 0;
private static int counter2 = 0;

public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(100_000);
ExecutorService executorService = Executors.newFixedThreadPool(100);

for (int i = 0; i < 100_000; i++) {
executorService.submit(() -> {
counter1++;
counter2++;
});
countDownLatch.countDown();
}

countDownLatch.await();

System.out.println(counter1);
System.out.println(counter2);

}

}

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

Какие проблемы тут возникнут если этот блок вызовет 2 человека одновременно?
@Transactional(isolation = Isolation.REPEATABLE_READ)
{
var product = productDao.findById(id);
var newPrice = product.getPrice - 100; //вычисляется очень долго (сложная логика)
product.setPrice(newPrice);
productDao.save(product);
}

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

Реализовать функцию решения уравнения вида ax^2 + bx + c = 0.
Результат работы вывести в консоль
public void solve (double a, double b, double c)


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

Провести код ревью, назвать проблемы. Потом написать решение одной из проблем

@Slf4j
public class SyncServiceImpl implements SyncService {

    @Autowired
    private SellerRestClient restClient;
    @Autowired
    private ShopRepository shopRepository;
    @Autowired
    private ProductRepository productRepository;
    @Autowired
    private KafkaTemplate<String, ProductDto> kafkaTemplate;

    @Schedule(cron = "* * * * * * ") // 1 sec
    @Override
    public void syncShops() {
        for (Shop shop : shopRepository.findAll()) {
            try {
                syncShop(shop);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    @Transactional
    @Override
    public void syncShop(Shop shop) {
        log.info("Syncing shop");
        shopRepository.lockShop(shop.getId()); // @Query(native = true, value = ""SELECT * FROM shop WHERE id = ? FOR UPDATE"")

        var products = shop.getNotSynchedProducts();
        products.parallelStream()
                .forEach(product -> {
                    log.info("Syncing product");
                    var seller = product.getSeller();
                    var sellerDetails = restClient.getLegalDetails(seller.getInn());

                    var dto = new ProductDto();
                    dto.setProduct(product);
                    dto.setSellerDetails(sellerDetails);

                    kafkaTemplate.send("product_details", "product", dto); // topic, key, value

                    product.setSynced(true);
                    productRepository.save(product);
                });
        shop.setSynced(true);
    }
}

Прислать задачу | Подписаться
Яндекс
/*
Реализуйте простую pub-sub систему для обмена событиями между компонентами с возможностью отписки через токены.

Требования:
- Подписка на события должна возвращать уникальный токен
- Отписка происходит по токену
- События должны доставляться асинхронно
- Система должна быть потокобезопасной.
*/

import java.util.function.Consumer;

class OrderCreated {
final String orderId;

OrderCreated(String orderId) {
this.orderId = orderId;
}
}

// Токен подписки - можно использовать любую реализацию
interface SubscriptionToken {
}

interface EventBus extends AutoCloseable {
SubscriptionToken subscribe(Consumer<OrderCreated> handler);
void unsubscribe(SubscriptionToken token);
void publish(OrderCreated event);
}

@Test
public void testEventDeliveryWithToken() throws InterruptedException {
EventBus eventBus = new EventBusImpl();

AtomicInteger orderCount = new AtomicInteger();
AtomicReference<String> lastOrderId = new AtomicReference<>();

SubscriptionToken token = eventBus.subscribe(order -> {
orderCount.incrementAndGet();
lastOrderId.set(order.orderId);
});

eventBus.publish(new OrderCreated("ORDER-123"));
Thread.sleep(100);

assertEquals(1, orderCount.get());
assertEquals("ORDER-123", lastOrderId.get());
}

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

/*
* Дано дерево папок. Вывести названия папок рекурсивно
* с отступами (как в IDE), где каждый уровень вложенности
* добавляет отступ.
*
* Пример вывода:
* src
* main
* java
* service
* repository
* resources
* test
*/
public static void printTree(File dir, int depth) {
// TODO
}

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