77. Вернуть число из списка, ближайшее к systemId
Условие задачи:
📌 Дан сервис ClosestNumberFinderService. Метод getSystemSecretNumber() загружает список чисел через NumberGenerator и должен вернуть число, ближайшее к systemId.
Если есть несколько подходящих чисел, нужно вернуть число с минимальной разницей до systemId.
Для примера: для List.of(3, 5, 7, 9, 12, 15) и systemId = 10 результат должен быть 9.
Код:
@Service
@RequiredArgsConstructor
public class ClosestNumberFinderService {
/* Бин подключается из библиотеки. Нам виден только интерфейс
public interface NumberGenerator {
List<Integer> loadNumbers();
}
*/
private final NumberGenerator generator;
private Integer systemId = 10;
public Integer getSystemSecretNumber() {
List<Integer> numbers = generator.loadNumbers();
return findClosestNumber(numbers, systemId);
}
// Пример для List.of(3, 5, 7, 9, 12, 15) и systemId=10, должно вернуться 9
private Integer findClosestNumber(List<Integer> numbers, int systemId) {
Number closestNumber = null;
//TODO техдолг. Реализовать логику
return closestNumber;
}
}
📌 Пример 1:
Вход:numbers = [3, 5, 7, 9, 12, 15]systemId = 10
Выход:9
📌 Пример 2:
Вход:numbers = [1, 8, 11, 20]systemId = 10
Выход:11
📌 Пример 3:
Вход:numbers = [10, 20, 30]systemId = 10
Выход:10
📌 Пример 4:
Вход:numbers = [-5, 0, 6]systemId = 4
Выход:6
Спойлеры к решению
Подсказки
systemId.💡 Удобно хранить текущее лучшее число и минимальную найденную разницу.
💡
closestNumber должен быть типа Integer, а не Number.💡 Стоит обработать случай пустого списка или
null.Решение
@Service
@RequiredArgsConstructor
public class ClosestNumberFinderService {
/* Бин подключается из библиотеки. Нам виден только интерфейс
public interface NumberGenerator {
List<Integer> loadNumbers();
}
*/
private final NumberGenerator generator;
private Integer systemId = 10;
public Integer getSystemSecretNumber() {
List<Integer> numbers = generator.loadNumbers();
return findClosestNumber(numbers, systemId);
}
// Пример для List.of(3, 5, 7, 9, 12, 15) и systemId=10, должно вернуться 9
private Integer findClosestNumber(List<Integer> numbers, int systemId) {
if (numbers == null || numbers.isEmpty()) {
return null;
}
Integer closestNumber = numbers.get(0);
int minDiff = Math.abs(closestNumber - systemId);
for (Integer number : numbers) {
int diff = Math.abs(number - systemId);
if (diff < minDiff) {
minDiff = diff;
closestNumber = number;
}
}
return closestNumber;
}
}
Нужно пройти по списку, посчитать модуль разницы до
systemIdи вернуть число с минимальной разницей.
В исходном коде ошибка в том, чтоclosestNumberобъявлен какNumber, хотя метод должен вернутьInteger, и сама логика пока не реализована.