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

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

Прислать задачи, реклама - @privatevoidmain
Download Telegram
Газпромбанк

Сделать ревью
/**
* Метод работает не всегда корректно.
* Как его можно отрефакторить или переписать, и как проверить, что ничего не сломалось?
*
* Метод возвращает индекс элемента в последовательности чисел, который соответствует дубликату.
*
* @param numbers
* @return
*
* 1,2,3,4,4,5,6
* 4
*
*/
public int findDuplicateIndex(int... numbers) {

int[] countArray = new int[nubmers.length];
for (int i = 0; i < numbers.length; i++) {
int current = numbers[i];
if (countArray[current] > 0) {
return i;
} else {
countArray[current] += 1;
}
}
throw new CustomException("Duplicate not found!");
}

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

Из исходного списка стран получить страну у которой будет максимальное значение отношения популяции к площади
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
Прислать задачу | Подписаться
2👍2
Яндекс #repeat

Вы — backend-разработчик в интернет-магазине.
Дела идут в гору и магазин решил повысить лояльность покупателей, предоставляя им персональные скидки.
К вам обратился product owner с задачей создать простую систему лояльности, которая предоставляет процентную скидку на корзину.
Размер скидки зависит от покупателя.
Аналитики уже определили, какие скидки должны быть предоставлены покупателям.


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

Корзина - список покупок покупателя.

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

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

Есть два вида скидки (не могут прийти одновременно):
- процент от суммы корзины
- фиксированная скидка

Сумма скидки распределяется равномерно между товарами, пропорционально цене товара.

Примеры:
- скидка 50%, в корзине товары на 50р и 100р. Скидка 25р и 50р
- скидка 10р, в корзине товары на 20р и 30р. Скидка 4р и 6р
- скидка 10р, в корзине товары на 1р и 99р. Скидка 10коп и 9р 90коп

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

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

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

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

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

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

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

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

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

1/ Классическая задача про скобки и стек
2/ Реализовать функцию, которая вычисляет значение арифметического выражения
Допустимые операторы: +, -, *, /

["2", "1", "+", "3", "*"] = 9
["4", "13", "5", "/", "+"] =6
["2", "+"] = error
["5", "0", "/"] = error

тут уточнили, что это польская обратная запись🤨

Прислать задачу | Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
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> {
}

Прислать задачу | Подписаться
💩6🤔3
Газпромбанк

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

public class Parser {

File file;

public synchronized void setFile(File file) {
this.file = file;
}

public synchronized File getFile() {
return file;
}

public String getContent() throws IOException {
InputStream i = new FileInputStream(file);
String output = "";
int data;
while ((data = i.read()) > 0) {
output += (char) data;
}
return output;
}

public String getContentWithoutUnicode() throws IOException {
InputStream i = new FileInputStream(file);
String output = "";
int data;
while ((data = i.read()) > 0) {
if (data < 0x80) {
output += (char) data;
}
}
return output;
}

public void saveContent(String content) throws IOException {
OutputStream o = new FileOutputStream(file);
for (int i = 0; i < content.length(); i +=1) {
o.write(content.charAt(i));
}
}
}

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

Задача на подсчет частоты чисел (Доп задание, отсортировать по значениям)
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
Прислать задачу | Подписаться
ВТБ #sql
Доменная модель компании ООО "Рога и копыта” представлена таблицами Department и Employee.
Необходимо вывести список сотрудников (id, name), которые получают максимальную ЗП в своем отделе.


Department
===
id
name


Employee
===
id
department_id
name
salary

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

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


#sber
Прислать задачу | Подписаться
🤔5
Если тг заблокируют, где вам было бы удобнее читать канал?(Можно выбрать несколько)
Anonymous Poll
77%
Телеграм (буду пользоваться впн)
17%
Вк
15%
Макс
4%
Дзен
1%
Сетка(hh)
1%
Другой вариант(напишу в комменты)
7%
.
👍51
Сбер

-- create
CREATE TABLE Employees (
id INTEGER PRIMARY KEY,
name VARCHAR NOT NULL
);

CREATE TABLE EmployeeUNI (
id INTEGER PRIMARY KEY,
unique_id INTEGER
);

-- insert
INSERT INTO Employees VALUES (1, 'Alice');
INSERT INTO Employees VALUES (7, 'Bob');
INSERT INTO Employees VALUES (11, 'Meir');
INSERT INTO Employees VALUES (90, 'Winston');
INSERT INTO Employees VALUES (3, 'Jonathan');

INSERT INTO EmployeeUNI VALUES (3, 1);
INSERT INTO EmployeeUNI VALUES (11, 2);
INSERT INTO EmployeeUNI VALUES (90, 3);

-----------------------------------------------------------------------
-- TODO


-----------------------------------------------------------------------

-- Написать запрос, который выведет unique_id для каждого пользователя.
-- Если для сотрудника нет записи в таблице EmployeeUNI, то вместо unique_id следует вывести null.

#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
Прислать задачу | Подписаться
🤔6
ВК (#repeat было от какой-то другой компании)

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

Input: [1,4,5,2,3,9,8,11,0,13]
Output: "0-5,8-9,11,13"
Input: [3,1,5]
Output: "1,3,5"
Input: [1,3,5]
Output: "1,3,5"

Дополнительные примеры: пустой массив, массив из одного элемента.
*/

#vk| Подписаться
3
Как вам 2026 в плане поиска работы? Ситуация на рынке лучше, чем в конце 2025?
Anonymous Poll
46%
Посмотреть результат
6%
Лучше
11%
Так же
24%
Хуже
14%
.
😱21
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
Прислать задачу | Подписаться
👍41
Сбер
Сбер

// 1. Добавить недостающие аннотации

public class OrganizationController {


private final OrganizationService organizationService

public void create(List<Organization> organizations) {
organizationService.create(organizations);
}
}

public interface OrganizationService {

void create(List<Organization> organizations);
}

public class OrganizationServiceImpl implements OrganizationService {

@Override
public void create(List<Organization> organizations) {
// Валидация атрибутов организаций
validate(organizations);

// Маппинг организаций на сущности
Set<OrganizationEntity> entities = map(organizations);

// Сохранение организаций в БД
save(entities);
}

private void validate(List<Organization> organizations) {
// 2. Проверить что список организаций не пустой

// 3. Проверить что нет организаций без счетов

// 4. Посчитать общее количество счетов у всех организаций
// и проверить что количество счетов не больше 10

// 5. Для каждого счета проверить что
// - счет не пустой
// - счет содержит только цифры


private Set<OrganizationEntity> map(List<Organization> organizations) {

// 6. Удалить дубликаты счетов
// Organization(accounts=[1, 1]) -> Organization(accounts=[1])

// 7. Из списка организаций составить множество сущностей
// Organization(accounts=[1, 2]) -> [OrganizationEntity(account=1), OrganizationEntity(account=2)]

return null;
}

private void save(Set<OrganizationEntity> entities) {
}
}

@Getter
@Setter
public class Organization {

/** Счета */
private List<String> accounts;
}

@Getter
@Setter
@Entity
@Table(name = "ORGANIZATION")
@EqualsAndHashCode(of = "account")
public class OrganizationEntity {

/** Идентификатор записи */
@Id
@GeneratedValue
@Column(name = "ID")
private UUID id;

/** Счет */
@Column(name = "ACCOUNT")
private Integer account;
}

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

Объяснить, что здесь происходит (#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 | Прислать задачу | Подписаться
👍6
Иннотех, втб #sql
Доменная модель компании ООО "Рога и копыта” представлена таблицами Department и Employee.
Необходимо вывести список сотрудников (id, name), которые получают максимальную ЗП в своем отделе.


Department
===
id
name


Employee
===
id
department_id
name
salary

#innotech | Прислать задачу | Подписаться
3👍1
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
Прислать задачу | Подписаться
1🔥11