From b7e9f0bf6b8f19ce32ec6ac4948c4cca632a1aab Mon Sep 17 00:00:00 2001 From: Dhruv Date: Sun, 5 Jul 2026 16:19:07 +0530 Subject: [PATCH 1/3] Add input validation to cyclic_sort for duplicates and out-of-range values --- sorts/cyclic_sort.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/sorts/cyclic_sort.py b/sorts/cyclic_sort.py index 9e81291548d4..f8a5f1ca5032 100644 --- a/sorts/cyclic_sort.py +++ b/sorts/cyclic_sort.py @@ -20,6 +20,9 @@ def cyclic_sort(nums: list[int]) -> list[int]: :param nums: List of n integers from 1 to n to be sorted. :return: The same list sorted in ascending order. + Raises: + ValueError: If the list contains duplicates or numbers outside range 1 to n. + Time complexity: O(n), where n is the number of integers in the list. Examples: @@ -27,9 +30,29 @@ def cyclic_sort(nums: list[int]) -> list[int]: [] >>> cyclic_sort([3, 5, 2, 1, 4]) [1, 2, 3, 4, 5] + + >>> cyclic_sort([1, 2, 3, 3]) + Traceback (most recent call last): + ... + ValueError: All numbers must be unique, got [1, 2, 3, 3] + >>> cyclic_sort([1, 2, 5]) + Traceback (most recent call last): + ... + ValueError: All numbers must be in range 1 to 3, got 5 """ - # Perform cyclic sort + # validate first + n = len(nums) + + if n != len(set(nums)): + raise ValueError(f"All numbers must be unique, got {nums}") + + for num in nums: + if num < 1 or num > n: + raise ValueError(f"All numbers must be in range 1 to {n}, got {num}") + + + # and then sort index = 0 while index < len(nums): # Calculate the correct index for the current element From 2d9d87d8b59c9cb4d6386472f64f5329f9b21484 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 5 Jul 2026 10:59:08 +0000 Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- sorts/cyclic_sort.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/sorts/cyclic_sort.py b/sorts/cyclic_sort.py index f8a5f1ca5032..a7647d576615 100644 --- a/sorts/cyclic_sort.py +++ b/sorts/cyclic_sort.py @@ -42,15 +42,14 @@ def cyclic_sort(nums: list[int]) -> list[int]: """ # validate first - n = len(nums) + n = len(nums) + + if n != len(set(nums)): + raise ValueError(f"All numbers must be unique, got {nums}") - if n != len(set(nums)): - raise ValueError(f"All numbers must be unique, got {nums}") - for num in nums: if num < 1 or num > n: - raise ValueError(f"All numbers must be in range 1 to {n}, got {num}") - + raise ValueError(f"All numbers must be in range 1 to {n}, got {num}") # and then sort index = 0 From 8449d79de850051babe3b5f6368492d004308201 Mon Sep 17 00:00:00 2001 From: Dhruv Date: Sun, 5 Jul 2026 16:38:30 +0530 Subject: [PATCH 3/3] Fix ruff EM102: assign f-string to variable before raising ValueError --- sorts/cyclic_sort.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sorts/cyclic_sort.py b/sorts/cyclic_sort.py index a7647d576615..c7e7e64bc0d1 100644 --- a/sorts/cyclic_sort.py +++ b/sorts/cyclic_sort.py @@ -45,11 +45,13 @@ def cyclic_sort(nums: list[int]) -> list[int]: n = len(nums) if n != len(set(nums)): - raise ValueError(f"All numbers must be unique, got {nums}") + msg = f"All numbers must be unique, got {nums}" + raise ValueError(msg) for num in nums: if num < 1 or num > n: - raise ValueError(f"All numbers must be in range 1 to {n}, got {num}") + msg = f"All numbers must be in range 1 to {n}, got {num}" + raise ValueError(msg) # and then sort index = 0