Реальные задачи с собеседований | Java
3.53K subscribers
278 photos
36 videos
474 links
Буду сюда выкладывать реальные задачи и вопросы с собеседований, без копипаста с интернета и других каналов)

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

Прислать задачи, реклама - @privatevoidmain
Download Telegram
диип200
Задача 2

Есть 3 сервиса.

Реклама баннерная (видео баннер, изображение, текстовый)
Курсы валют (код валюты, название, покупка, продажа)
Меню услуг (название, описание, изображение)

Есть клиентские приложения:

ЖК панель, которая отображает рекламу и курсы. Обращается к сервисам 1 и 2.
Терминал (киоск), который отображает меню услуг и выдает талончики. Может отображать курсы и рекламу. Обращается к сервису 1, 2, 3.

Необходимо:

Реализовать API для клиентских приложений.
Клиентские приложения (ЖК, Киоск) не должны отображать изменения, без подтверждения человека. Например: Мы изменили в сервисе рекламу, загрузили новую картинку или изменили существующую, она должна пройти модерацию человеком сначала, после подтверждения на ЖК будут видны изменения. Второй пример: Киоск отображает меню услуг, в адмике изменили название услуги, это название должна пройти модерацию, только после этого Киоск ее получит. До подтверждения, Киоск отображает старое название.

Прислать задачу | Подписаться
👍21
Rightline (аутстафф в тбанк)

Сделать код-ревью
/**
* API поиска авторов и их книг по имени автора (полное ФИО или часть имени в любом регистре).
* Также компонент при каждом поиске обновляет статистику по частоте использования поисковой строки (сбрасывается раз в сутки другой системой)
* При обнаружении популярного запроса (> 1000 запросов в сутки), по которому находится много авторов, отправляется алерт.
* Алерт должен отправляться не более 1 раза за сутки для каждого запроса
* Все классы на самом деле находятся в разных файлах, однако здесь представлены в одном месте для удобства
*/
@RestController
public class AuthorController {
@Autowired
private AuthorSearchService service;

@GetMapping("/authors")
public List<AuthorDto> readAllAuthors(@RequestParam String query) {
List<Author> authors = service.search(query);
return authors.stream().map(el -> {
return new Mapper().map(el);
}).collect(Collectors.toList());
}
}

@Component
public class AuthorSearchService {

@Autowired
private AuthorsRepository authorsRepository;
@Autowired
private StatisticsRepository statisticsRepository;

private AlertRestClient arc = new AlertRestClient();

// В query может быть как полностью ФИО, так и часть имени, например "Вадим Панов" или "панов"
@Transactional
public List<Author> search(String query) {
List<Author> authors = authorsRepository.findByNameContainingIgnoreCase(query);
Statistics s = statisticsRepository.findById(query).orElse(null);
if (s == null) s = new Statistics(query);
s.setNumbers(s.getNumbers() + 1);
statisticsRepository.save(s);
if (s.getNumbers() > 1000 && authors.size() > 1000) {
System.out.println("too popular search with too much data, sending an alert...");
arc.send(query, s.getNumbers(), authors.size());
}

return authors;
}
}


@Entity
@Data
public class Author {
@Id
@GeneratedValue
private Long id;

private String name;

@OneToMany(mappedBy = "author")
private List<Book> books;

public Author(String name) {
this.name = name;
}
}

@Entity
@Data
public class Statistics {
@Id
private String query;
private int numbers;

public Statistics(String query) {
this.query = query;
}
}


@Data
public class AuthorDto {
private Long id;
private String name;
private List<Book> books;
}


@Entity
@Data
public class Book {
private Long id;
private String name;
}

Прислать задачу | Подписаться
👍1
Яндекс
/*
Написать функцию, которая принимает 2 строки (текст и алфавит)
и возвращает самую короткую подстроку этого текста, в которой есть каждый символ из алфавита хотя бы по разу (но возможно и другие символы тоже).
Если подстрок подходящей длины несколько, нужно вернуть ту, которая находится ближе к началу текста.

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

Примеры:
searchPangram("abacaba", "bc") == "bac" <- выбираем левую из двух одинаковой длины 'bac' и 'cab'
searchPangram("bacb", "bc") == "cb"
abbc ac => abbc
searchPangram("abacaba", "bcd") == ""
*/

#yandex | Прислать задачу | Подписаться
👍21
Яндекс
/*
Корзина - список товаров покупателя.

Товар:
- id
- цена
- итоговая стоимость c учетом скидки

Скидка. Для покупателя может быть задан % скидки (целое число).


## Задача
Написать часть системы, которая:
- на вход получает id покупателя и корзину
- вычисляет и применяет скидки
- возвращает корзину, с применёнными скидками. Скидка учитывается в стоимости покупки

*/

#yandex | Прислать задачу | Подписаться
🔥31
Яндекс
Дан массив чисел a_1, a_2, ..., a_n.

Необходимо найти монотонный подотрезок
(то есть строго убывающий или строго возрастающий)
максимальной длины и вернуть пару индексов его начала и конца.

Примеры:

[2, 7, 5, 4, 4, 3] -> [1, 3]
[1, 1] -> {1, 1} // or [0, 0]

*/

[1, 10, 10] - {1, 10}

#yandex | Прислать задачу | Подписаться
👍41
Авито
В жизни каждого приходит время, когда надо отправиться в отпуск. Но мы смотрим на календарь и понимаем, что впереди куча встреч, которые не хочется пропускать.

Необходимо определить день X начала отпуска длиной в V дней так, чтобы отгулять весь отпуск в ближайшие P дней и пропустить минимум Y встреч. Считаем, что уже завтра первый возможный день отпуска (day: 1)

# Пример 1
# ввод
daysWithMeetings = [{ day: 3, meetings: 1 }, { day: 4, meetings: 3 }, { day: 14, meetings: 3 }, { day: 21, meetings: 3 }, { day: 28, meetings: 1 },] # дни со встречами уже упорядочены
periodLength = 30 # В какой срок надо отгулять ВЕСЬ отпуск. В данном примере в ближайшие 30 дней
vacationLength = 7
# вывод
[5, 0] # [день X начала отпуска, сколько встреч Y пропустим]

# Пример 2
# ввод
daysWithMeetings = [{ day: 3, meetings: 1 }, { day: 4, meetings: 3 }, { day: 5, meetings: 3 }, { day: 9, meetings: 5 }, { day: 13, meetings: 2 }, { day: 14, meetings: 1 }, { day: 21, meetings: 3 }, { day: 25, meetings: 3 }, { day: 28, meetings: 6 },]
periodLength = 31
vacationLength = 14
# вывод
[10, 6] # [через сколько дней начало отпуска, сколько встреч пропустим]

#avito | Подписаться
23
Яндекс
Дано 2 массива с числами от 1 до N, нужно найти уникальные пересечения множеств элементов из первого и второго для каждого из N индексов
Пример:
1 2 3 5 4
5 3 7 4 1

Ответ:
0 0 1 2 3

для нулевого индекса нет пересечений среди элементов доступных в настоящий момент(1 в первом и 5 во втором)

для первого индекса тоже(1,2 в первом и 5,3 во втором)

для 2го индекса: 1,2,3 в первом и 5,3,7 во втором. Есть пересечение 3 - ставим 1

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

Ищут джуна-архитектора😳😂 Ищут джуна, чтобы потом дообучить его на архитектора
import java.util.*;
import java.lang.*;
import java.io.*;

//Напишите программу, которая заменяет все вхождения строки "abc" на "xyz" в данном тексте(abc is a string with abc in it)
class Codechef
{
public static void main (String[] args) throws java.lang.Exception
{

}
}

#sber | Прислать задачу | Подписаться
😁102🤯2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁28🤔16👍5
СБЕР

#
Следующий класс работает в продакшен среде.
Класс компилируется и не содержит Runtime исключений.
Но у него есть несколько проблем, которые вам предлагается найти их, и предложить
идеи по исправлению(рефакторингу),
* class Cat4Profile существует и находится в том же пакете

public class Cat4 {
private final ConcurrentHashMap<byte[], BigDecimal> CACHE = new ConcurrentHashMap<>();
public int jumpsCount = 0;
private Cat4Profile cat4Profile;
private final DataSource dataSource;

public Cat4(DataSource dataSource) {
this.dataSource = dataSource;
}

public void doRandomJumps(int maxJumps) {
Random rnd = new Random();
int jumpsToDo = Math.abs(rnd.nextInt()) % maxJumps;
for (int i = 0; i < jumpsToDo; i++) {
new Thread(() -> {
doJump();
}).start();
}
}

public void setCat4Profile(Cat4Profile cat4Profile) {
this.cat4Profile = cat4Profile;
}

public String getCat4Name() {
try {
return this.cat4Profile.getCatName();
} catch (NullPointerException e) {
return "Max";
}
}

public void doJump() {
this.jumpsCount++;
Logger.getLogger(Cat4.class.getName()).fine("Jump!");
}

public void doMeow() {
Logger.getLogger(Cat4.class.getName()).fine("Meow!");
}

public BigDecimal doQuery(byte[] parameters) throws SQLException {
Connection conn = null;
Statement stmt = null;
try {
conn = dataSource.getConnection();
stmt = conn.createStatement();
ResultSet resultSet = stmt.executeQuery("select weight from Cat where name = '" + new
String(parameters) + "')");

resultSet.next();
return resultSet.getBigDecimal("weight");
} finally {
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
}

public BigDecimal doQueryCached(byte[] parameters) throws SQLException {
if (CACHE.get(parameters) != null)
return CACHE.get(parameters);

BigDecimal weight = doQuery(parameters);
CACHE.put(parameters, weight);
return weight;
}

public int getJumpsCount() {
int result = jumpsCount;
jumpsCount = 0;
return result;
}

public void setJumpsCount() {
this.jumpsCount++;
}
}

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

Что будет выведено?
class MyCode {
public static void main(String[] args) {
SuperBase sb = new Base();
Object o = "";
sb.mm(o);
sb.mm("");
}
static class SuperBase {
public int i = 3;

protected void mm(Object o) {
System.out.println("Object " + i);
}

private void mm(String o) {
System.out.println("String " + i);
}
}

public static class Base extends SuperBase {
public Base() {
i = 5;
}
}
}

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

Сделать код ревью

import java.util.UIID;

/**
* Сервис бронирования места в самолете.
* Клиент с купленным билетом может за дополнительную плату выбрать конкретное место.
* Базовая цена мест определяется тарифами (внешним сервисом).
* Для клиентов с определенными тарифами (PREMIUM, ULTRA) необходимо сделать скидку при оплате.
* При бронировании клиенту выставляется инвойс на оплату. Управление оплатой осуществляется в стороннем сервисе.
*/
@Service
public class SeatBookingService {

@Autowired private SeatBookingRepository seatBookingRepository;
@Autowired private TicketRepository ticketRepository;
@Autowired private TariffClient tariffClient;
@Autowired private CustomerClient customerClient;
@Autowired private PaymentClient paymentClient;

/**
* Бронирование.
* @param seatCode код места (например 19A)
* @param ticketId ид билета
*/
@Transactional
public void bookSeat(String seatCode, UIID ticketId) {
var ticket = ticketRepository.findById(ticketId);
// бронируем
var seatBooking = new SeatBooking(seatCode, ticket.get().getFlightId(), ticketId, BookingStatus.BOOKED);
seatBookingRepository.save(seatBooking);

// ищем базовый тариф для выбранного места в самолете
var basePrice = tariffClient.getBasePrice(ticket.get().getPlaneModel(), seatCode);
// ищем данные о клиенте
long userId = (long) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
var userData = customerClient.getCustomer(userId);
System.out.println("Найден пользователь " + userData.getFio() + " номер документа " + userData.getDocument());
var price = basePrice;
if (userData.getTariff() == "PREMIUM") {
// скидка 50%
price = basePrice * 0.5d;
}
if (userData.getTariff() == "ULTRA") {
// скидка 20%
price = basePrice * 0.8d;
}
var invoice = new Invoice(price, ticketId, userId);
// выставляем платежку
paymentClient.sendInvoice(invoice);
}
}

@Data
@Table("seat_booking")
public class SeatBooking {

@Column
private String seatCode;

@Column
private UUID flightId;

@Column
private UUID ticketId;

@Column
private BookingStatus status;
}

public enum BookingStatus {
BOOKED, PAID;
}

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

Дописать метод +рефакторинг
/*

Спроектировать класс "Банкомат", хранящий купюры в различных номиналах.,
Предусмотреть методы загрузки, выгрузки, расчета остатка, выдачи суммы клиенту (в номинальном разрезе)*/,
public class Atm {
    Hashtable<Short, Integer> denominations; // номиналы /
    public void load(Hashtable<Short, Integer> denominations) {
        this.denominations = new Hashtable<>();
        Object[]keys = denominations,keySet().toArray();
        for (int i = 0; i < keys.length; i++) {
            this.denominations.put((Short)keys[i], denominations.get((Short)keys[i]));
        }
    }

//Выгружает банкноты, оставляя пустую емкость.
//@return карта "номинал" -> число выгруженных купюр
public Hashtable<Short, Integer> unload() {
    Hashtable<Short, Integer> result = new Hashtable<>();
    Object[] keys = denominations.keySet().toArray();
        for (int i = 0; i < keys.length; i++) {
            result.put((Short)keys[i], denominations.get((Short)keys[i]));
        }
        return result;
    }

    
//Рассчитывает остаток в банкомате.
@return*/
public Integer getRest() {
    int result = new Integer(0);
    Object[] keys = denominations.keySet().toArray();,

        for (int i = 0; i < keys.length; i++) {
            result += (Integer)denominations.get((Short)keys[i]) * (Short)keys[i];
        }
        return result;
    }
}
public HashTable<Short, Integer> dispense (Integer amount) {
//TODO
return null;
}

#sber | Прислать задачу | Подписаться
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Всех с окончанием рабочей недели)
#fridaymemes
😁283👎2👍1🔥1