Реальные задачи с собеседований | Java
4.55K subscribers
296 photos
63 videos
2 files
625 links
Буду сюда выкладывать реальные задачи и вопросы с собеседований, без копипаста с интернета и других каналов)

Ссылка для друга - https://t.me/+K4vJFdalwlthYTQy

Прислать задачи, реклама - @privatevoidmain
Download Telegram
ВК
/**
* Есть два ступенчатых графика некоторых наблюдаемых величин, заданных отсортированными списками
* координат начала ступенек (<время измерения>, <значение>). Подразумевается, что величина сохраняет
* своё значение между измерениями. До первого измерения величина равна нулю.
* Требуется построить новый график, который будет являться суммой двух представленных.
* Т.е. построить график, на котором для каждой точки (измерения) из первого и второго графика
* есть соответствующая точка.
* <p>
* Напишите функцию, которая по двум заданным массивам измерений вернёт сумму двух представленных
* массивов.
* <p>
* Input: a={{1, 2}, {5, 1}}, b={{2, 4}, {3, 6}, {9, 7}})
* Output: {{1, 2}, {2, 6}, {3, 8}, {5, 7}, {9, 8}}
*/
public class Template12 {

public static void main(String[] args) {
var res12 = stepSumWithMemory(new int[][]{{1, 2}, {3, 6}, {5, 1}}, new int[][]{{2, 4}, {3, 6}, {9, 7}});
System.out.println(res12.stream().map(Arrays::toString).collect(Collectors.toList()));
}

public static List<int[]> stepSumWithMemory(int[][] first, int[][] second) {
// todo
}
}

#vk
Прислать задачу | Подписаться
💩4
Сбер
@Data
@AllArgsConstructor
public static class Person {

public Integer id;
public String firstName;
public String secondName;
public String lastName;
}




@Test
public void test() {
List<Person> persons = new ArrayList<>();
persons.add(new Person(1,"Ivan","Vasya","Petr"));
persons.add(new Person(2,"Ivan","Vasya","Petr"));
persons.add(new Person(3,"Ivan","Vasya","Petr"));
persons.add(new Person(4,"Ivan","Gupta","Ivan"));
persons.add(new Person(5,"Petr","Rama","Igor"));

Collection<Person> uniquePersons = unique(persons);
assert uniquePersons.size() == 3;
}

//Unique collection by combination first-second-last names
public static Collection<Person> unique(List<Person> persons){
//Реализовать
}

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

public interface UserNotificationApi {
void sendCode(String orderId, String code);
}

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

public ??? placeOrder(??? orderId) {
}
public ??? getOrder(??? receiveCode) {
}
}

#yandex
Прислать задачу
| Подписаться
👍14❤1
Яндекс на стажера

public interface WeightedRandomPicker {
void add(int value, int weight);
int getRandom();
}
Реализовать структуру, которая добавляет элемент и его вес, и с определенной вероятностью возвращает его.
То есть для элементов
(1,2,3,4) с весом (1,2,3,4)
getRandom() должен вернуть 1 с вероятностью 1/10, 2 с вероятностью 1/5, 3 с вероятностью 3/10 и 4 с вероятностью 2/5

#yandex
Прислать задачу
| Подписаться
💩6😁2👍1
x5

4) UserService рефакторинг
@Service
public class UserService {
    // Стандартный Spring репозиторий
    private final UserRepository repo;
   
   
    // Сервис email оповещений. Для отправки письма делает запрос в сторонний сервис.
    private final EmailNotificationService service;
   
   
    // Сервис аудита, важно чтобы он не влиял на основной flow даже если не смог сохранить информацию
    private final AuditService auditService;
 
    @Transactional
    public List<User> getAll() {
        return repo.findAll();
    }
 
    @Transactional
    public List<User> saveAll(List<User> users) {
        repo.saveAll(users);
        try {
            users.forEach(user -> service.notify(user));
        } catch (Exception ex) {
            System.out.println("Error sending email");
        }
 
        logCreateOperation(saved);
    }
 
    @Transactional()
    private void logCreateOperation(List<User> users) {
        auditService.log("Users created: " + users.size());
    }
}

#x5tech
Прислать задачу | Подписаться
👍3😁3
x5
3) Пространственная, временная сложность
var matrix[n][n]
for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        for (int k = 0; k < 100_000_000; k++) {
            sout(matrix[i][j])
        }
    }
}

#x5tech
Прислать задачу | Подписаться
🤯2
x5

2) class User {
  String name;
  int age;
} // Из List<User> вернуть имена пользователей, которые страше 16 лет, и их имена начинаются на Я

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

/*
Реализуйте throttler для ограничения частоты событий от IoT устройств.
Датчики отправляют события, но нужно контролировать их частоту для экономии bandwidth.

Требования:
- Использование sliding window алгоритма
- Потокобезопасность - события приходят из разных потоков
- Очистка устаревших записей
*/

import java.time.*;
import java.util.*;
import java.util.concurrent.*;

class EventThrottler {
private final int maxEventsByDevice;
private final Duration windowDuration;

public EventThrottler(int maxEventsByDevice, Duration windowDuration) {
this.maxEventsByDevice = maxEventsByDevice;
this.windowDuration = windowDuration;
}

/**
* Проверяет, можно ли принять eventCount событий от устройства.
* Каждое устройство имеет свой независимый лимит.
*
* @param deviceId идентификатор устройства
* @param eventCount количество событий для добавления
* @return true если события приняты, false если превышен лимит
*/
public boolean shouldAcceptEvent(String deviceId, int eventCount) {
// TODO: реализуйте sliding window алгоритм

return false;
}
}

@Test
public void testBasicEventThrottling() throws InterruptedException {
EventThrottler throttler = new EventThrottler(3, Duration.ofSeconds(1));

String deviceId = "sensor-temp-01";

assertTrue(throttler.shouldAcceptEvent(deviceId, 1));
assertTrue(throttler.shouldAcceptEvent(deviceId, 2));

// 4-е событие должно быть отклонено
assertFalse(throttler.shouldAcceptEvent(deviceId, 1));

Thread.sleep(1100);
assertTrue(throttler.shouldAcceptEvent(deviceId, 1));
}

#yandex
Прислать задачу
| Подписаться
🤯7💩1
Яндекс (стажировка)
Дана строка.
Найти количество её непрерывных подстрок,
которые содержат все уникальные символы из этой строки хотя бы по одному разу.

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