From d7d53d5fa004dfafca0322fb2f793f35cacd3df6 Mon Sep 17 00:00:00 2001 From: Leonid Date: Wed, 7 May 2025 10:05:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BE=D0=B4=20=D0=BF=D0=BE=20=D0=B7=D0=B0=D0=BC?= =?UTF-8?q?=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D1=8F=D0=BC:=20-=20=D0=9E=D0=BF?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=20=D1=82=D0=BE=D1=87=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=B2=D1=8B=D0=B1=D0=B8=D1=80=D0=B0=D0=B5=D1=82=D1=81=D1=8F?= =?UTF-8?q?=20=D1=81=D0=BB=D1=83=D1=87=D0=B0=D0=B9=D0=BD=D1=8B=D0=BC=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B7=D0=BE=D0=BC.=20-=20=D0=A3=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=BB=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B5=D0=B5=20?= =?UTF-8?q?=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BF=D0=B8=D0=B8=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0.=20-?= =?UTF-8?q?=20=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D0=BA=D0=BE?= =?UTF-8?q?=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20?= =?UTF-8?q?=D0=B2=D1=85=D0=BE=D0=B4=D0=BD=D1=8B=D1=85=20=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ExcelProcessorService.java | 4 --- .../excelprocessor/util/QuickSelect.java | 25 ++++++++++++++++--- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/example/excelprocessor/service/ExcelProcessorService.java b/src/main/java/com/example/excelprocessor/service/ExcelProcessorService.java index d673b81..d764e5b 100644 --- a/src/main/java/com/example/excelprocessor/service/ExcelProcessorService.java +++ b/src/main/java/com/example/excelprocessor/service/ExcelProcessorService.java @@ -20,10 +20,6 @@ public class ExcelProcessorService { public Integer findNthSmallest(MultipartFile file, int n) throws IOException { List numbers = excelReader.readNumbersFromFirstColumn(file); - - if (n < 1 || n > numbers.size()) { - throw new IllegalArgumentException("Некорректный порядковый номер N"); - } return QuickSelect.findNthSmallest(numbers, n); } } \ No newline at end of file diff --git a/src/main/java/com/example/excelprocessor/util/QuickSelect.java b/src/main/java/com/example/excelprocessor/util/QuickSelect.java index f2fcfe6..c7d11da 100644 --- a/src/main/java/com/example/excelprocessor/util/QuickSelect.java +++ b/src/main/java/com/example/excelprocessor/util/QuickSelect.java @@ -1,15 +1,30 @@ package com.example.excelprocessor.util; -import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; +import java.util.Random; -public class QuickSelect { +public final class QuickSelect { + + private static final Random random = new Random(); public static int findNthSmallest(List numbers, int n) { - List copyList = new ArrayList<>(numbers); - return quickSelect(copyList, 0, copyList.size() - 1, n - 1); + validateNumbersNotEmpty(numbers); + + if (n < 1 || n > numbers.size()) { + throw new IllegalArgumentException("Некорректный порядковый номер N"); + } + + return quickSelect(numbers, 0, numbers.size() - 1, n - 1); + } + + private static void validateNumbersNotEmpty(List numbers) { + + if (Objects.isNull(numbers) || numbers.isEmpty()) { + throw new IllegalArgumentException("Список не может быть пустым"); + } } private static int quickSelect(List numbers, int from, int to, int n) { @@ -31,6 +46,8 @@ public class QuickSelect { private static int partition(List list, int from, int to) { + int pivotIdx = from + random.nextInt(to - from + 1); + Collections.swap(list, pivotIdx, to); int currIdx = from; int pivot = list.get(to);