Book Similarity - codepath/compsci_guides GitHub Wiki
TIP102 Unit 6 Session 2 Advanced (Click for link to problem statements)
Problem Highlights
- 💡 Difficulty: Medium
- ⏰ Time to complete: 20-30 mins
- 🛠️ Topics: Linked Lists, Sets, Consecutive Subsets
1: U-nderstand
Understand what the interviewer is asking for by using test cases and questions about the problem.
- Q: What does the problem ask for?
- A: The problem asks to count the number of similar book components in the
subset
array. Two books are considered similar if they appear consecutively in theall_books
linked list.
- A: The problem asks to count the number of similar book components in the
- Q: What should be returned?
- A: The function should return the number of similar book components.
HAPPY CASE
Input:
- all_books1 = Node(0, Node(1, Node(2, Node(3))))
- subset1 = [0, 1, 3]
Output:
- 2
Explanation:
- 0 and 1 are similar, so [0, 1] and [3] are the two similar components.
EDGE CASE
Input:
- all_books2 = Node(0, Node(1, Node(2, Node(3, Node(4)))))
- subset2 = [0, 3, 1, 4]
Output:
- 2
Explanation:
- 0 and 1 are similar, 3 and 4 are similar, so [0, 1] and and [3, 4] are the similar components.
2: M-atch
Match what this problem looks like to known categories of problems, e.g. Linked Lists, Sets, Consecutive Subsets, etc.
For Linked List problems involving Consecutive Subsets, we want to consider the following approaches:
- Traversal: Traverse the linked list while checking whether consecutive nodes belong to the
subset
. - Sets: Use a set to quickly check membership of a value in the
subset
.
3: P-lan
Plan the solution with appropriate visualizations and pseudocode.
General Idea: We will traverse the linked list and use a set to check if each node's value is part of the subset
. If consecutive nodes belong to the subset, they are part of the same component. If not, a new component begins.
1) Convert the `subset` array into a set for quick lookup.
2) Initialize a variable `similar_count` to 0 and a boolean `in_component` to False.
3) Traverse the linked list:
- If the current node's value is in the set and we are not already in a component, increment `similar_count` and set `in_component` to True.
- If the current node's value is not in the set, set `in_component` to False.
4) Continue until the entire list is traversed.
5) Return the value of `similar_count`.
⚠️ Common Mistakes
- Forgetting to reset the
in_component
flag when a non-subset node is encountered, which could lead to incorrect counting. - Incorrectly handling edge cases where the subset is empty or the list is empty.
4: I-mplement
Implement the code to solve the algorithm.
class Node:
def __init__(self, value, next=None):
self.value = value
self.next = next
def similar_book_count(all_books, subset):
subset_set = set(subset)
current = all_books
similar_count = 0
in_component = False
while current:
if current.value in subset_set:
if not in_component:
similar_count += 1
in_component = True
else:
in_component = False
current = current.next
return similar_count
5: R-eview
Review the code by running specific example(s) and recording values (watchlist) of your code's variables along the way.
- Example: Use the provided
all_books
andsubset
to verify that the function correctly counts the similar components.
6: E-valuate
Evaluate the performance of your algorithm and state any strong/weak or future potential work.
Assume N
represents the length of the linked list.
- Time Complexity:
O(N)
because we traverse the entire linked list once. - Space Complexity:
O(S)
whereS
is the size of thesubset
set.