Skip to content

Commit 7afab9b

Browse files
committedJan 17, 2025·
Add solution for checking valid perfect squares
Implemented a binary search-based function to check if a number is a perfect square. Added unit tests to cover perfect squares, non-perfect squares, edge cases, and numbers near perfect squares.
1 parent 9cbb455 commit 7afab9b

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed
 

Diff for: ‎Binary Search/Math/__init__.py

Whitespace-only changes.

Diff for: ‎Binary Search/Math/valid_perfect_square.py

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# https://leetcode.com/problems/valid-perfect-square
2+
3+
import unittest
4+
5+
6+
def is_perfect_square(num: int) -> bool:
7+
left = 0
8+
right = num
9+
10+
while left <= right:
11+
mid = (left + right) // 2
12+
13+
squared = mid * mid
14+
15+
if squared == num:
16+
return True
17+
18+
if squared < num:
19+
left = mid + 1
20+
else:
21+
right = mid - 1
22+
23+
return False
24+
25+
26+
class TestIsPerfectSquare(unittest.TestCase):
27+
def test_perfect_squares(self):
28+
# Testing basic perfect squares
29+
self.assertTrue(is_perfect_square(1))
30+
self.assertTrue(is_perfect_square(4))
31+
self.assertTrue(is_perfect_square(9))
32+
self.assertTrue(is_perfect_square(16))
33+
self.assertTrue(is_perfect_square(25))
34+
self.assertTrue(is_perfect_square(36))
35+
self.assertTrue(is_perfect_square(49))
36+
self.assertTrue(is_perfect_square(64))
37+
self.assertTrue(is_perfect_square(81))
38+
self.assertTrue(is_perfect_square(100))
39+
40+
def test_non_perfect_squares(self):
41+
# Testing numbers that are not perfect squares
42+
self.assertFalse(is_perfect_square(2))
43+
self.assertFalse(is_perfect_square(3))
44+
self.assertFalse(is_perfect_square(5))
45+
self.assertFalse(is_perfect_square(6))
46+
self.assertFalse(is_perfect_square(7))
47+
self.assertFalse(is_perfect_square(8))
48+
self.assertFalse(is_perfect_square(10))
49+
self.assertFalse(is_perfect_square(11))
50+
51+
def test_edge_cases(self):
52+
# Test edge cases like 0, 1 and a very large number
53+
self.assertTrue(is_perfect_square(0)) # 0 is a perfect square
54+
self.assertTrue(is_perfect_square(1)) # Edge case where the number itself is 1
55+
self.assertFalse(
56+
is_perfect_square(2147483647)
57+
) # Large number that's not a perfect square
58+
59+
def test_numbers_around_perfect_squares(self):
60+
# Testing numbers that are close to perfect squares
61+
self.assertFalse(is_perfect_square(15)) # Close to 16
62+
self.assertFalse(is_perfect_square(17)) # Close to 16
63+
self.assertFalse(is_perfect_square(24)) # Close to 25
64+
self.assertFalse(is_perfect_square(26)) # Close to 25

0 commit comments

Comments
 (0)
Please sign in to comment.