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

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

Прислать задачи, реклама - @privatevoidmain
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Ситуация, которая может случиться с каждым


Всех с окончанием рабочей недели
#fridaymemes
😁23💩8😢5❤1
x5

Необходимо реализовать сервис для работы с каталогом товаров.
Метод init вызывается один раз модератором для сохранения данных в системе (жестких требований к быстродействию нет).
После отработки метода init пользователи начинают обращаться в два других метода (высокий RPS, требуется быстрый ответ методов)


public interface Category {
Long getId();
String getName();
}

public interface Product {
Long getId();
String getName();
List<Category> getCategories();
}


public class ProductCategoryService {

/**
* Метод вызывается 1 раз,
* инициализирует сервис всеми товарами и категориями.
*/
@Override
public void init(List<Product> products, List<Category> categories) {
//TODO implement
}


/**
* Проверяет принадлежность товара к категории,
* может вызываться много раз и часто.
*
* @param productId идентификатор товара
* @param categoryId идентификатор категории
* @return {@code true} если товар принадлежит к категории,
* в остальных случаях {@code false}
*/
@Override
public boolean isProductInCategory(Long productId, Long categoryId) {
//
//TODO implement
}

/**
* Возвращает список товаров по категории.
* Товары должны быть отсортированы по имени.
* Может вызываться много раз и часто.
*
* @param categoryId идентификатор категории
* @return список товаров, принадлежащих к категории
* или пустой список,
* если к категории не принадлежит ни один товар
*/
@Override
public Collection<Product> getProductsByCategory(Long categoryId) {
//
//TODO implement
}
}

#x5tech
Прислать задачу | Подписаться
❤2👍1
Recordlinker

Write a simple tool to normalize company names that reads stream of lines (one company name per line) and outputs a stream of tab separated pairs (old name\tnormalized name)

Rules do not imply order and case insensitive

Should be lowercase

Trim unnecessary spaces and remove duplicate spaces

Filter out lines prefixed with "xx", "donotuse", "DO NOT USE"

Normalize terms:
"insurance" from "ins", "insur", "insuran", "insuranc"
"company" from "companies", "comp", "co", "corp", "company inc"

spell out year
"2006" as "two thousand six"

fix spelling
"Ameican" -> "American"
"Adminstrative" -> "Administrative"

Remove punctuation

Replace "&" with " and "

Keep only unique results

Sort by normalized names, then by original name



"ABRDN COMPANY TWO THOUSAND SIX",
"PROTECTIVE INSURANCE COMPANY",
"donotuseHULL & COMPANY INC",
"Rochdale Insurance Co.",
"Scottsdale Ins. Co. ",
"CRC- UMB CAMP (2006)",
"ABRDN CO. 2006",
"Adminstrative&Services Group",
" Great Ameican Insurance Co.",
"Fidelity & Deposit Companies",
"DO NOT USE-Less than A rated",
"ROCHDALE INSURANCE CO.",
"Fidelity Investments Institutional Services Co, Inc."

Прислать задачу | Подписаться
🤯7❤4
ВК
/**
* Есть два ступенчатых графика некоторых наблюдаемых величин, заданных отсортированными списками
* координат начала ступенек (<время измерения>, <значение>). Подразумевается, что величина сохраняет
* своё значение между измерениями. До первого измерения величина равна нулю.
* Требуется построить новый график, который будет являться суммой двух представленных.
* Т.е. построить график, на котором для каждой точки (измерения) из первого и второго графика
* есть соответствующая точка.
* <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
Прислать задачу
| Подписаться