Skip to content

Commit 2289c9d

Browse files
committed
feat(algorithms, findmissingelem): add implementation and tests for finding missing element in an array
1 parent ef8af1c commit 2289c9d

File tree

7 files changed

+124
-48
lines changed

7 files changed

+124
-48
lines changed

puzzles/find_missing_elem/README.md renamed to algorithms/arrays/find_missing_elem/README.md

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,25 @@ A[0] = 2 A[1] = 3 A[2] = 1 A[3] = 5 the function should return 4, as it is the m
1818
Write an efficient algorithm for the following assumptions:
1919

2020
N is an integer within the range [0..100,000]; the elements of A are all distinct; each element of array A is an integer
21-
within the range [1..(N + 1)].
21+
within the range [1..(N + 1)].
22+
23+
## Constraints
24+
25+
- n = `nums.length`
26+
- 1 ≤ n 10^3
27+
- 0 ≤ `nums[i]` ≤ n
28+
- There are no duplicates in the array
29+
30+
## Examples
31+
32+
![Example 1](images/examples/find_missing_element_example_1.png)
33+
![Example 2](images/examples/find_missing_element_example_2.png)
34+
35+
## Topics
36+
37+
- Array
38+
- Hash Table
39+
- Math
40+
- Binary Search
41+
- Bit Manipulation
42+
- Sorting
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
from typing import List
2+
3+
4+
def find_missing_element(numbers: List[int]) -> int:
5+
"""
6+
Finds the missing element in a list of numbers
7+
Args:
8+
numbers (List[int]): list of numbers
9+
Returns:
10+
int: missing element
11+
"""
12+
missing_element = len(numbers)
13+
14+
for index, number in enumerate(numbers):
15+
missing_element = missing_element ^ number ^ index
16+
17+
return missing_element
18+
19+
20+
def find_missing_number(nums):
21+
len_nums = len(nums)
22+
index = 0
23+
24+
while index < len_nums:
25+
value = nums[index]
26+
27+
if value < len_nums and value != nums[value]:
28+
nums[index], nums[value] = nums[value], nums[index]
29+
30+
else:
31+
index += 1
32+
33+
for x in range(len_nums):
34+
if x != nums[x]:
35+
return x
36+
return len_nums
37+
38+
39+
def find_missing_number_sum_of_n_terms(nums):
40+
"""
41+
Finds the missing element in a list of numbers
42+
43+
The sum of the first n natural numbers is given by the formula (n * (n + 1)) / 2. The idea is to compute this sum
44+
and subtract the sum of all elements in the array from it to get the missing number.
45+
46+
Args:
47+
nums (List[int]): list of numbers
48+
Returns:
49+
int: missing element
50+
"""
51+
len_nums = len(nums)
52+
53+
total_sum = sum(nums)
54+
55+
expected_sum = len_nums * (len_nums + 1) // 2
56+
57+
return expected_sum - total_sum
18.1 KB
Loading
19.8 KB
Loading
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import unittest
2+
from typing import List
3+
from parameterized import parameterized
4+
from . import (
5+
find_missing_element,
6+
find_missing_number,
7+
find_missing_number_sum_of_n_terms,
8+
)
9+
10+
FIND_MISSING_ELEMENT_TEST_CASES = [
11+
([0, 2, 3, 4, 5], 1),
12+
([0, 1, 2, 3, 5, 6, 7], 4),
13+
([0, 1, 2, 3, 4, 5, 6, 7], 8),
14+
([1], 0),
15+
([1, 0, 2, 3, 4, 5, 6, 8, 9, 7, 11], 10),
16+
([1, 4, 5, 6, 8, 2, 0, 7], 3),
17+
([3, 0, 1, 4], 2),
18+
([0, 1, 2, 4], 3),
19+
([9, 6, 4, 2, 3, 5, 7, 0, 1], 8),
20+
([0, 1], 2),
21+
([3, 0, 1], 2),
22+
([8, 2, 4, 5, 3, 7, 1, 0], 6),
23+
([0, 1, 2, 3, 5], 4),
24+
]
25+
26+
27+
class FindMissingElementTestCases(unittest.TestCase):
28+
@parameterized.expand(FIND_MISSING_ELEMENT_TEST_CASES)
29+
def test_find_missing_element(self, nums: List[int], expected: int):
30+
actual = find_missing_element(nums)
31+
self.assertEqual(expected, actual)
32+
33+
@parameterized.expand(FIND_MISSING_ELEMENT_TEST_CASES)
34+
def test_find_missing_number(self, nums: List[int], expected: int):
35+
actual = find_missing_number(nums)
36+
self.assertEqual(expected, actual)
37+
38+
@parameterized.expand(FIND_MISSING_ELEMENT_TEST_CASES)
39+
def test_find_missing_number_sum_of_n_terms(self, nums: List[int], expected: int):
40+
actual = find_missing_number_sum_of_n_terms(nums)
41+
self.assertEqual(expected, actual)
42+
43+
44+
if __name__ == "__main__":
45+
unittest.main()

puzzles/find_missing_elem/__init__.py

Lines changed: 0 additions & 17 deletions
This file was deleted.

puzzles/find_missing_elem/test_find_missing_elem.py

Lines changed: 0 additions & 30 deletions
This file was deleted.

0 commit comments

Comments
 (0)