diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 884aa8d..f88f77b 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,42 +4,38 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
- {
- "lastFilter": {
- "state": "OPEN",
- "assignee": "Subham1999"
- }
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
{
- "customColor": "",
- "associatedIndex": 5
+ "associatedIndex": 8
}
-
+
@@ -89,44 +57,31 @@
{
"keyToString": {
- "ASKED_SHARE_PROJECT_CONFIGURATION_FILES": "true",
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
- "SHARE_PROJECT_CONFIGURATION_FILES": "true",
"git-widget-placeholder": "back__tracking",
- "jdk.selected.JAVA_MODULE": "openjdk-21 (3)",
- "last_opened_file_path": "/Users/subhamsantra/Projects/Interview/TheAlgorithm/data-structures/src/main/java/com/thealgorithm",
- "onboarding.tips.debug.path": "/Users/subhamsantra/Projects/Interview/TheAlgorithm/low-level-design/src/main/java/com/subham/tbpp/Main.java",
+ "last_opened_file_path": "/Users/subhamsantra/Projects/Interview/TheAlgorithm/low-level-design/src/main/resources/lld_diagrams",
"settings.editor.selected.configurable": "preferences.lookFeel"
}
}
-
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
+
-
-
-
+
+
+
-
+
@@ -134,12 +89,12 @@
-
-
+
+
-
+
@@ -147,12 +102,12 @@
-
-
-
+
+
+
-
+
@@ -160,12 +115,12 @@
-
-
+
+
-
+
@@ -173,471 +128,58 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
-
-
- 1697990784388
-
-
- 1697990784388
-
-
+
- 1698424039035
+ 1730640988098
- 1698424039035
+ 1730640988098
-
+
+
+ 1730902113595
+
+
+ 1730902113595
+
+
- 1703998378726
+ 1730990637618
- 1703998378726
-
-
-
- 1704135970895
-
-
-
- 1704135970896
-
-
-
- 1704567274241
-
-
-
- 1704567274241
-
-
-
- 1704567985293
-
-
-
- 1704567985293
-
-
-
- 1704648907146
-
-
-
- 1704648907146
-
-
-
- 1704913919024
-
-
-
- 1704913919024
+ 1730990637618
-
-
- 1704913928698
-
-
-
- 1704913928698
-
-
-
- 1705771943057
-
-
-
- 1705771943057
-
-
-
- 1706035019019
-
-
-
- 1706035019019
-
-
-
- 1706207177913
-
-
-
- 1706207177913
-
-
-
- 1709577825479
-
-
-
- 1709577825480
-
-
-
- 1709577862710
-
-
-
- 1709577862710
-
-
-
- 1709577893204
-
-
-
- 1709577893204
-
-
-
- 1719246568449
-
-
-
- 1719246568449
-
-
-
- 1719643309297
-
-
-
- 1719643309297
-
-
-
- 1721584067350
-
-
-
- 1721584067350
-
-
-
- 1721826731054
-
-
-
- 1721826731054
-
-
-
- 1724391214032
-
-
-
- 1724391214032
-
-
-
- 1724587970323
-
-
-
- 1724587970323
-
-
-
- 1724607329919
-
-
-
- 1724607329919
-
-
-
- 1724607395957
-
-
-
- 1724607395957
-
-
-
- 1724607617792
-
-
-
- 1724607617792
-
-
-
- 1724738320689
-
-
-
- 1724738320689
-
-
-
- 1724742612046
-
-
-
- 1724742612046
-
-
-
- 1724869859287
-
-
-
- 1724869859287
-
-
-
- 1724869912287
-
-
-
- 1724869912287
-
-
-
- 1724954143566
-
-
-
- 1724954143566
-
-
-
- 1725033464461
-
-
-
- 1725033464461
-
-
-
- 1725044292132
-
-
-
- 1725044292132
-
-
-
- 1725088358813
-
-
-
- 1725088358813
-
-
-
- 1725129705304
-
-
-
- 1725129705304
-
-
-
- 1725215225004
-
-
-
- 1725215225004
-
-
-
- 1725217568204
-
-
-
- 1725217568204
-
-
-
- 1725812239746
-
-
-
- 1725812239746
-
-
-
- 1725822875850
-
-
-
- 1725822875850
-
-
-
- 1726823495217
-
-
-
- 1726823495217
-
-
-
- 1727499290118
-
-
-
- 1727499290118
-
-
-
- 1728061074126
-
-
-
- 1728061074126
-
-
-
- 1728416974021
-
-
-
- 1728416974021
-
-
-
- 1729345170365
-
-
-
- 1729345170365
-
-
-
- 1729348659507
-
-
-
- 1729348659507
-
-
-
- 1729416219895
-
-
-
- 1729416219896
-
-
-
- 1730103136030
-
-
-
- 1730103136030
-
-
-
- 1730103173375
-
-
-
- 1730103173375
-
-
-
- 1730103372472
-
-
-
- 1730103372472
-
-
-
- 1730274050189
-
-
-
- 1730274050189
-
-
-
- 1730537779798
-
-
-
- 1730537779798
-
-
-
- 1730571702127
-
-
-
- 1730571702127
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -814,8 +356,4 @@
-
-
-
-
\ No newline at end of file
diff --git a/data-structures/src/main/java/com/thealgorithm/Main.java b/data-structures/src/main/java/com/thealgorithm/Main.java
index 5f3400d..8b8c3b5 100644
--- a/data-structures/src/main/java/com/thealgorithm/Main.java
+++ b/data-structures/src/main/java/com/thealgorithm/Main.java
@@ -1,7 +1,57 @@
package com.thealgorithm;
+import java.util.Arrays;
+
public class Main {
public static void main(String[] args) {
- System.out.println("Say! Hello Algoithm!!");
+
+ System.out.println(new Solution().takeCharacters("aabbccca", 2));
+ }
+}
+
+class Solution {
+ private int[] count;
+ private int k;
+ private int[][] DP;
+
+ public int takeCharacters(String s, int k) {
+ if (k == 0) {
+ return 0;
+ }
+ count = new int[3];
+ this.k = k;
+ DP = new int[s.length()][s.length()];
+ for (int[] _d : DP) Arrays.fill(_d, -1);
+
+ takeAndReturn(s, 0, s.length() - 1, 0);
+
+ return DP[0][s.length() - 1] == Integer.MAX_VALUE ? -1 : DP[0][s.length() - 1];
+ }
+
+ int takeAndReturn(String s, int left, int right, int minutes) {
+ // System.out.println(Arrays.toString(count) + " " + left + " " + right);
+ if (count[0] >= k && count[1] >= k && count[2] >= k) {
+ return minutes;
+ }
+
+ if (left > right) {
+ return Integer.MAX_VALUE;
+ }
+
+ if (DP[left][right] != -1) {
+ return DP[left][right];
+ }
+
+ int ans;
+
+ count[s.charAt(left) - 'a']++;
+ ans = takeAndReturn(s, left + 1, right, minutes + 1);
+ count[s.charAt(left) - 'a']--;
+
+ count[s.charAt(right) - 'a']++;
+ ans = Math.min(ans, takeAndReturn(s, left, right - 1, minutes + 1));
+ count[s.charAt(right) - 'a']--;
+
+ return DP[left][right] = ans;
}
}
diff --git a/data-structures/src/main/java/com/thealgorithm/array/SortZeroOneTwo.java b/data-structures/src/main/java/com/thealgorithm/array/SortZeroOneTwo.java
new file mode 100644
index 0000000..069780a
--- /dev/null
+++ b/data-structures/src/main/java/com/thealgorithm/array/SortZeroOneTwo.java
@@ -0,0 +1,20 @@
+package com.thealgorithm.array;
+
+public class SortZeroOneTwo {
+ public static void main(String[] args) {}
+
+ static void sort(int[] arr) {
+ int left = 0;
+ int right = arr.length - 1;
+
+ while (left <= right) {
+ if (arr[left] == 2 && arr[right] == 0) {}
+ }
+ }
+
+ static void swap(int[] a, int i, int j) {
+ int x = a[i];
+ a[i] = a[j];
+ a[j] = x;
+ }
+}
diff --git a/data-structures/src/main/java/com/thealgorithm/dp/MoveOnMatrix.java b/data-structures/src/main/java/com/thealgorithm/dp/MoveOnMatrix.java
new file mode 100644
index 0000000..b865855
--- /dev/null
+++ b/data-structures/src/main/java/com/thealgorithm/dp/MoveOnMatrix.java
@@ -0,0 +1,24 @@
+package com.thealgorithm.dp;
+
+public class MoveOnMatrix {
+
+ public static void main(String[] args) {
+ System.out.println(new MoveOnMatrix().solve(3, 3));
+ }
+
+ int solve(int m, int n) {
+ return solve(m - 1, 0, m - 1, n - 1);
+ }
+
+ private int solve(int i, int j, int I, int J) {
+ if (i == I && j == J) {
+ return 1;
+ }
+ if (i > I || j > J) return 0;
+
+ int w1 = solve(i - 1, j + 1, I, J);
+ int w2 = solve(i, j + 1, I, J);
+ int w3 = solve(i + 1, j + 1, I, J);
+ return w1 + w2 + w3;
+ }
+}
diff --git a/data-structures/src/main/java/com/thealgorithm/graph/MakeLexicographicallySmallestArrayBySwappingElements.java b/data-structures/src/main/java/com/thealgorithm/graph/MakeLexicographicallySmallestArrayBySwappingElements.java
new file mode 100644
index 0000000..ec83bc6
--- /dev/null
+++ b/data-structures/src/main/java/com/thealgorithm/graph/MakeLexicographicallySmallestArrayBySwappingElements.java
@@ -0,0 +1,68 @@
+package com.thealgorithm.graph;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class MakeLexicographicallySmallestArrayBySwappingElements {
+
+ private static class Solution {
+ private static class Point {
+ final int val;
+ final int index;
+
+ public Point(int val, int index) {
+ this.val = val;
+ this.index = index;
+ }
+ }
+
+ public int[] lexicographicallySmallestArray(int[] nums, int limit) {
+ final Point[] points = new Point[nums.length];
+ for (int i = 0; i < nums.length; ++i) {
+ points[i] = new Point(nums[i], i);
+ }
+
+ Arrays.sort(points, Comparator.comparingInt(p -> p.val));
+
+ // Connected components
+ List> list = new ArrayList<>();
+ List tempList = new ArrayList<>();
+
+ for (int i = 0; i < points.length; ++i) {
+ if (i == 0) {
+ tempList.add(points[i]);
+ } else {
+ if (points[i].val - tempList.getLast().val > limit) {
+ list.add(tempList);
+ tempList = new ArrayList<>();
+ }
+ tempList.add(points[i]);
+ }
+ }
+ list.add(tempList);
+
+ Map> map = new HashMap<>();
+ for (var l : list) {
+ for (var ll : l) {
+ map.put(ll.index, l.iterator());
+ }
+ }
+
+ int[] answer = new int[nums.length];
+ for (int i = 0; i < nums.length; ++i) {
+ answer[i] = map.get(i).next().val;
+ }
+
+ return answer;
+ }
+ }
+
+ public static void main(String[] args){
+ System.out.println(Arrays.toString(new Solution().lexicographicallySmallestArray(new int[]{1, 4, 2, 1, 4, 2, 1}, 1)));
+ }
+}
diff --git a/data-structures/src/main/java/com/thealgorithm/linkedlist/ReverseSentence.java b/data-structures/src/main/java/com/thealgorithm/linkedlist/ReverseSentence.java
new file mode 100644
index 0000000..9accdf4
--- /dev/null
+++ b/data-structures/src/main/java/com/thealgorithm/linkedlist/ReverseSentence.java
@@ -0,0 +1,76 @@
+package com.thealgorithm.linkedlist;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ReverseSentence {
+
+ public static class Node {
+ char c;
+ Node next;
+
+ public Node(char c, Node next) {
+ this.c = c;
+ this.next = next;
+ }
+
+ public Node() {}
+ }
+
+ public static class Creator {
+ public static Node prepare(String sentence) {
+ if (sentence.isBlank()) {
+ return null;
+ }
+
+ Node head = new Node();
+ Node node = head;
+
+ for (char c : sentence.toCharArray()) {
+ node.c = c;
+ node.next = new Node();
+ }
+
+ return head;
+ }
+ }
+
+ public static class Printer {
+ static void print(Node node) {
+ for (; node != null; node = node.next) {
+ System.out.print(node.c);
+ System.out.print(' ');
+ }
+ System.out.println();
+ }
+ }
+
+ public static class Solution {
+ public static Node reverseIt(Node head) {
+ Node node = head;
+ Node left, right;
+ left = right = node;
+
+ while (node != null) {
+ if (node.c == ' ') {
+ partialReverse(left, right);
+ right = left = node.next;
+ } else {
+ right = node;
+ }
+ }
+ return head;
+ }
+
+ private static void partialReverse(Node left, Node right) {
+ Node head = left;
+
+ }
+ }
+
+ public static void main(String[] args) {
+ Node sentence = Creator.prepare("Hi this is Subham, are you ok?");
+ Printer.print(sentence);
+ Printer.print(Solution.reverseIt(sentence));
+ }
+}
diff --git a/data-structures/src/main/java/com/thealgorithm/multithreading/Print1To100.java b/data-structures/src/main/java/com/thealgorithm/multithreading/Print1To100.java
new file mode 100644
index 0000000..1197cd7
--- /dev/null
+++ b/data-structures/src/main/java/com/thealgorithm/multithreading/Print1To100.java
@@ -0,0 +1,35 @@
+package com.thealgorithm.multithreading;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+public class Print1To100 {
+ static class Counter {
+ transient int val;
+
+ synchronized void incrementOnce() {
+ val++;
+ }
+
+ void print() {
+ System.out.println(Thread.currentThread().getName() + " - " + val);
+ }
+ }
+
+ public static void main(String[] args) {
+ ExecutorService executorService = Executors.newFixedThreadPool(10);
+ Counter counter = new Counter();
+ ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
+
+ for (int i = 0; i < 100; ++i) {
+ executorService.submit(
+ () -> {
+ readWriteLock.writeLock().lock();
+ counter.incrementOnce();
+ counter.print();
+ readWriteLock.writeLock().unlock();
+ });
+ }
+ }
+}
diff --git a/data-structures/src/main/java/com/thealgorithm/stacks/ShortestSubArrayToBeRemovedToMakeArraySorted.java b/data-structures/src/main/java/com/thealgorithm/stacks/ShortestSubArrayToBeRemovedToMakeArraySorted.java
new file mode 100644
index 0000000..827580f
--- /dev/null
+++ b/data-structures/src/main/java/com/thealgorithm/stacks/ShortestSubArrayToBeRemovedToMakeArraySorted.java
@@ -0,0 +1,94 @@
+package com.thealgorithm.stacks;
+
+import java.util.Arrays;
+
+public class ShortestSubArrayToBeRemovedToMakeArraySorted {
+
+ public int findLengthOfShortestSubarray(int[] arr) {
+ int leftSequenceStop = 0, rightSequenceStop = arr.length - 1;
+
+ for (int i = 1; i < arr.length; ++i) {
+ if (arr[i - 1] > arr[i]) {
+ leftSequenceStop = i - 1;
+ break;
+ }
+ }
+
+ for (int i = arr.length - 2; i >= leftSequenceStop; --i) {
+ if (arr[i] > arr[i + 1]) {
+ rightSequenceStop = i + 1;
+ break;
+ }
+ }
+
+ int answer = 0;
+
+ System.out.println(Arrays.toString(Arrays.copyOfRange(arr, 0, leftSequenceStop)));
+ System.out.println(Arrays.toString(Arrays.copyOfRange(arr, rightSequenceStop, arr.length)));
+
+ for (int i = rightSequenceStop; i < arr.length; ++i) {
+ answer = Math.max(answer, upperBoundIndex(arr, 0, leftSequenceStop, arr[i]) + arr.length - i);
+ }
+
+ for (int i = leftSequenceStop; i >= 0; --i) {
+ answer =
+ Math.max(
+ answer,
+ lowerBoundIndex(arr, rightSequenceStop, arr.length - 1, arr[leftSequenceStop]));
+ }
+
+ return answer == 0 ? 0 : arr.length - answer;
+ }
+
+ int upperBoundIndex(int[] arr, int lo, int hi, int t) {
+ int m;
+ int ans = -1;
+
+ while (lo <= hi) {
+ m = (lo + hi) >> 1;
+ if (arr[m] <= t) {
+ lo = m + 1;
+ } else {
+ ans = m;
+ hi = m - 1;
+ }
+ }
+
+ return ans;
+ }
+
+ int lowerBoundIndex(int[] arr, int lo, int hi, int t) {
+ int m;
+ int ans = arr.length;
+
+ while (lo <= hi) {
+ m = (lo + hi) >> 1;
+ if (arr[m] >= t) {
+ hi = m - 1;
+ } else {
+ ans = m;
+ lo = m + 1;
+ }
+ }
+
+ return ans;
+ }
+
+ public static void main(String[] args) {
+ System.out.println(
+ new ShortestSubArrayToBeRemovedToMakeArraySorted()
+ .findLengthOfShortestSubarray(new int[] {1, 2, 11, 10, 4, 11, 12, 15}));
+ //
+ // System.out.println(
+ // new ShortestSubArrayToBeRemovedToMakeArraySorted()
+ // .findLengthOfShortestSubarray(new int[] {1, 2, 2, 3, 3, 3, 4, 4, 4, 5, 6}));
+ //
+ // System.out.println(
+ // new ShortestSubArrayToBeRemovedToMakeArraySorted()
+ // .findLengthOfShortestSubarray(new int[] {5, 4, 3, 2, 1}));
+
+ System.out.println(
+ new ShortestSubArrayToBeRemovedToMakeArraySorted()
+ .findLengthOfShortestSubarray(new int[] {1, 2, 3, 10, 0, 7, 8, 9}));
+ }
+}
diff --git a/data-structures/src/main/java/com/thealgorithm/tierIII/Pattern_0.java b/data-structures/src/main/java/com/thealgorithm/tierIII/Pattern_0.java
new file mode 100644
index 0000000..49e7eee
--- /dev/null
+++ b/data-structures/src/main/java/com/thealgorithm/tierIII/Pattern_0.java
@@ -0,0 +1,38 @@
+package com.thealgorithm.tierIII;
+
+public class Pattern_0 {
+ public static void main(String[] args) {
+ printLevelGoNext(1, 50);
+ }
+
+ public static void printLevelGoNext(int level, int n) {
+ if (level > n) {
+ return;
+ } else {
+ printC('\n', 1);
+ }
+
+ printLevel(level, n);
+ printLevelGoNext(level + 1, n);
+ }
+
+ private static void printLevel(int level, int n) {
+ printSpaces(level, n);
+ printStars((level << 1) - 1);
+ }
+
+ private static void printC(char c, int n) {
+ if (n > 0) {
+ System.out.print(c);
+ printC(c, n - 1);
+ }
+ }
+
+ private static void printStars(int n) {
+ printC('*', n);
+ }
+
+ private static void printSpaces(int level, int n) {
+ printC(' ', (n - level));
+ }
+}
diff --git a/data-structures/src/main/java/com/thealgorithm/tree/basics/BinarySearchTree.java b/data-structures/src/main/java/com/thealgorithm/tree/basics/BinarySearchTree.java
new file mode 100644
index 0000000..3890d61
--- /dev/null
+++ b/data-structures/src/main/java/com/thealgorithm/tree/basics/BinarySearchTree.java
@@ -0,0 +1,51 @@
+package com.thealgorithm.tree.basics;
+
+public class BinarySearchTree {
+ private BinarySearchTreeNode root;
+
+ public BinarySearchTree() {}
+
+ public void add(int data) {
+ if (root == null) {
+ root = new BinarySearchTreeNode(data);
+ } else {
+ add(root, data);
+ }
+ }
+
+ private void add(BinarySearchTreeNode node, int data) {
+ if (node.getData() < data) {
+ if (node.getRight() == null) {
+ node.setRight(new BinarySearchTreeNode(data));
+ } else {
+ add(node.getRight(), data);
+ }
+ } else {
+ if (node.getLeft() == null) {
+ node.setLeft(new BinarySearchTreeNode(data));
+ } else {
+ add(node.getLeft(), data);
+ }
+ }
+ }
+
+ public boolean search(int data) {
+ return search(root, data);
+ }
+
+ private boolean search(BinarySearchTreeNode node, int data) {
+ if (node == null) {
+ return false;
+ }
+ if (node.getData() == data) {
+ return true;
+ }
+
+ if (node.getData() < data) {
+ return search(node.getRight(), data);
+ }
+ return search(node.getLeft(), data);
+ }
+
+ public void remove(int data) {}
+}
diff --git a/data-structures/src/main/java/com/thealgorithm/tree/basics/BinarySearchTreeNode.java b/data-structures/src/main/java/com/thealgorithm/tree/basics/BinarySearchTreeNode.java
new file mode 100644
index 0000000..87d3298
--- /dev/null
+++ b/data-structures/src/main/java/com/thealgorithm/tree/basics/BinarySearchTreeNode.java
@@ -0,0 +1,21 @@
+package com.thealgorithm.tree.basics;
+
+import lombok.Data;
+
+@Data
+public class BinarySearchTreeNode {
+ private int data;
+ private BinarySearchTreeNode left;
+ private BinarySearchTreeNode right;
+
+ /** For ROOT the depth is 1 */
+ private int depth;
+
+ /** This includes the current node itself */
+ private int subtreeSize;
+
+ public BinarySearchTreeNode(int data) {
+ this.data = data;
+ this.subtreeSize = 1;
+ }
+}
diff --git a/data-structures/src/main/java/com/thealgorithm/tree/basics/TreeTest.java b/data-structures/src/main/java/com/thealgorithm/tree/basics/TreeTest.java
new file mode 100644
index 0000000..5ac639f
--- /dev/null
+++ b/data-structures/src/main/java/com/thealgorithm/tree/basics/TreeTest.java
@@ -0,0 +1,21 @@
+package com.thealgorithm.tree.basics;
+
+public class TreeTest {
+ public static void main(String[] args){
+
+ BinarySearchTree binarySearchTree = new BinarySearchTree();
+
+ System.out.println(binarySearchTree.search(10));
+
+ binarySearchTree.add(10);
+
+ System.out.println(binarySearchTree.search(10));
+
+ binarySearchTree.add(10);
+ binarySearchTree.add(5);
+ binarySearchTree.add(55);
+
+ System.out.println(binarySearchTree.search(70));
+ System.out.println(binarySearchTree.search(55));
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/BattingScoreCard.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/BattingScoreCard.java
new file mode 100644
index 0000000..8c2754e
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/BattingScoreCard.java
@@ -0,0 +1,11 @@
+package com.thealgorithm.cricbuzz;
+
+import lombok.Data;
+
+@Data
+public class BattingScoreCard {
+ private int totalRun;
+ private int totalBowlPlayed;
+ private int totalWideBalls;
+ private int totalNoBalls;
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/BowlingScoreCard.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/BowlingScoreCard.java
new file mode 100644
index 0000000..9f9f66a
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/BowlingScoreCard.java
@@ -0,0 +1,3 @@
+package com.thealgorithm.cricbuzz;
+
+public class BowlingScoreCard {}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/CatchWicketDetail.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/CatchWicketDetail.java
new file mode 100644
index 0000000..7015925
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/CatchWicketDetail.java
@@ -0,0 +1,13 @@
+package com.thealgorithm.cricbuzz;
+
+import lombok.Data;
+
+@Data
+public class CatchWicketDetail extends WicketDetail {
+ private Player caughtBy;
+
+ public CatchWicketDetail(Player batsman, Player bowler, Player caughtBy) {
+ super(batsman, bowler);
+ this.caughtBy = caughtBy;
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/HitWicketDetail.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/HitWicketDetail.java
new file mode 100644
index 0000000..9fc60fc
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/HitWicketDetail.java
@@ -0,0 +1,6 @@
+package com.thealgorithm.cricbuzz;
+
+import lombok.Data;
+
+@Data
+public class HitWicketDetail extends WicketDetail {}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/Inning.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/Inning.java
new file mode 100644
index 0000000..30fcf81
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/Inning.java
@@ -0,0 +1,17 @@
+package com.thealgorithm.cricbuzz;
+
+import java.util.ArrayList;
+import java.util.List;
+import lombok.Data;
+
+@Data
+public class Inning {
+ private Team bowlingTeam;
+ private Team battingTeam;
+ private List wicketDetails = new ArrayList<>();
+
+ public Inning(Team bowlingTeam, Team battingTeam) {
+ this.bowlingTeam = bowlingTeam;
+ this.battingTeam = battingTeam;
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/LBWWicketDetail.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/LBWWicketDetail.java
new file mode 100644
index 0000000..ed2a2cd
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/LBWWicketDetail.java
@@ -0,0 +1,3 @@
+package com.thealgorithm.cricbuzz;
+
+public class LBWWicketDetail extends WicketDetail {}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/Match.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/Match.java
new file mode 100644
index 0000000..779683d
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/Match.java
@@ -0,0 +1,36 @@
+package com.thealgorithm.cricbuzz;
+
+import com.thealgorithm.cricbuzz.event.MatchEvent;
+import com.thealgorithm.cricbuzz.pubsub.MatchEventObserver;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class Match extends MatchEventObserver {
+ private Team teamA;
+ private Team teamB;
+ private Team tossWinningTeam;
+ private Team firstBattingTeam;
+ private Inning firstInning;
+ private Inning secondInning;
+
+ public Match(Team teamA, Team teamB, Team tossWinningTeam, Team firstBattingTeam) {
+ this.teamA = teamA;
+ this.teamB = teamB;
+ this.tossWinningTeam = tossWinningTeam;
+ this.firstBattingTeam = firstBattingTeam;
+
+ this.firstInning = new Inning(other(firstBattingTeam), firstBattingTeam);
+ this.secondInning = new Inning(firstBattingTeam, other(firstBattingTeam));
+ }
+
+ private Team other(Team team) {
+ return teamA.equals(team) ? teamB : teamA;
+ }
+
+ @Override
+ public void observe(MatchEvent matchEvent) {
+ // score board updaters
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/MatchType.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/MatchType.java
new file mode 100644
index 0000000..cc07706
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/MatchType.java
@@ -0,0 +1,5 @@
+package com.thealgorithm.cricbuzz;
+
+public interface MatchType {
+ int numberOfOvers();
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/Player.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/Player.java
new file mode 100644
index 0000000..15e96e9
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/Player.java
@@ -0,0 +1,11 @@
+package com.thealgorithm.cricbuzz;
+
+import lombok.Data;
+
+@Data
+public class Player {
+ private String name;
+ private PlayerType playerType;
+ private BattingScoreCard battingScoreCard;
+ private BowlingScoreCard bowlingScoreCard;
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/PlayerType.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/PlayerType.java
new file mode 100644
index 0000000..a76e285
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/PlayerType.java
@@ -0,0 +1,7 @@
+package com.thealgorithm.cricbuzz;
+
+public enum PlayerType {
+ BOWLER,
+ BATSMAN,
+ ALL_ROUNDER
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/Team.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/Team.java
new file mode 100644
index 0000000..c7abbc7
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/Team.java
@@ -0,0 +1,11 @@
+package com.thealgorithm.cricbuzz;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Team {
+ private List playing11;
+ private List extraPlayers;
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/WicketDetail.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/WicketDetail.java
new file mode 100644
index 0000000..a9e0030
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/WicketDetail.java
@@ -0,0 +1,13 @@
+package com.thealgorithm.cricbuzz;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class WicketDetail {
+ private Player batsman;
+ private Player bowler;
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/BowledOutEvent.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/BowledOutEvent.java
new file mode 100644
index 0000000..6336f54
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/BowledOutEvent.java
@@ -0,0 +1,6 @@
+package com.thealgorithm.cricbuzz.event;
+
+import lombok.Data;
+
+@Data
+public class BowledOutEvent extends WicketEvent {}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/FourEvent.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/FourEvent.java
new file mode 100644
index 0000000..58a507d
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/FourEvent.java
@@ -0,0 +1,13 @@
+package com.thealgorithm.cricbuzz.event;
+
+import com.thealgorithm.cricbuzz.Player;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class FourEvent extends NormalRunMatchEvent {
+ public FourEvent(Player bowledBy, Player batmanOne, Player batmanTwo, boolean sideChange) {
+ super(bowledBy, batmanOne, batmanTwo, 4, sideChange);
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/LBWEvent.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/LBWEvent.java
new file mode 100644
index 0000000..e2aeafd
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/LBWEvent.java
@@ -0,0 +1,6 @@
+package com.thealgorithm.cricbuzz.event;
+
+import lombok.Data;
+
+@Data
+public class LBWEvent extends WicketEvent{}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/MatchEvent.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/MatchEvent.java
new file mode 100644
index 0000000..57eab01
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/MatchEvent.java
@@ -0,0 +1,19 @@
+package com.thealgorithm.cricbuzz.event;
+
+import com.thealgorithm.cricbuzz.Player;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class MatchEvent {
+ private Player bowledBy;
+ private Player batmanOne;
+ private Player batmanTwo;
+
+ public MatchEvent(Player bowledBy, Player batmanOne, Player batmanTwo) {
+ this.bowledBy = bowledBy;
+ this.batmanOne = batmanOne;
+ this.batmanTwo = batmanTwo;
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/NormalRunMatchEvent.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/NormalRunMatchEvent.java
new file mode 100644
index 0000000..c32b9c1
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/NormalRunMatchEvent.java
@@ -0,0 +1,19 @@
+package com.thealgorithm.cricbuzz.event;
+
+import com.thealgorithm.cricbuzz.Player;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class NormalRunMatchEvent extends MatchEvent {
+ private int totalScore;
+ private boolean sideChange;
+
+ public NormalRunMatchEvent(
+ Player bowledBy, Player batmanOne, Player batmanTwo, int totalScore, boolean sideChange) {
+ super(bowledBy, batmanOne, batmanTwo);
+ this.totalScore = totalScore;
+ this.sideChange = sideChange;
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/SixerEvent.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/SixerEvent.java
new file mode 100644
index 0000000..0228288
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/SixerEvent.java
@@ -0,0 +1,12 @@
+package com.thealgorithm.cricbuzz.event;
+
+import com.thealgorithm.cricbuzz.Player;
+import lombok.Data;
+
+@Data
+public class SixerEvent extends NormalRunMatchEvent {
+
+ public SixerEvent(Player bowledBy, Player batmanOne, Player batmanTwo, boolean sideChange) {
+ super(bowledBy, batmanOne, batmanTwo, 6, sideChange);
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/WicketEvent.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/WicketEvent.java
new file mode 100644
index 0000000..b460ef0
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/event/WicketEvent.java
@@ -0,0 +1,6 @@
+package com.thealgorithm.cricbuzz.event;
+
+import lombok.Data;
+
+@Data
+public abstract class WicketEvent extends MatchEvent{ }
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/pubsub/MatchEventObservable.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/pubsub/MatchEventObservable.java
new file mode 100644
index 0000000..464dbed
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/pubsub/MatchEventObservable.java
@@ -0,0 +1,22 @@
+package com.thealgorithm.cricbuzz.pubsub;
+
+import com.thealgorithm.cricbuzz.event.MatchEvent;
+import java.util.ArrayList;
+import java.util.List;
+
+public class MatchEventObservable {
+ private MatchEvent matchEvent;
+ private List matchEventObservers;
+
+ public MatchEventObservable() {
+ this.matchEventObservers = new ArrayList<>();
+ }
+
+ public void onEvent(MatchEvent matchEvent) {
+ synchronized (this) {
+ for (MatchEventObserver matchEventObserver : matchEventObservers) {
+ matchEventObserver.observe(matchEvent);
+ }
+ }
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/cricbuzz/pubsub/MatchEventObserver.java b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/pubsub/MatchEventObserver.java
new file mode 100644
index 0000000..33c4577
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/cricbuzz/pubsub/MatchEventObserver.java
@@ -0,0 +1,8 @@
+package com.thealgorithm.cricbuzz.pubsub;
+
+import com.thealgorithm.cricbuzz.event.MatchEvent;
+
+public abstract class MatchEventObserver {
+
+ public abstract void observe(MatchEvent matchEvent);
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/pubsub/Broker.java b/low-level-design/src/main/java/com/thealgorithm/pubsub/Broker.java
new file mode 100644
index 0000000..4216588
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/pubsub/Broker.java
@@ -0,0 +1,30 @@
+package com.thealgorithm.pubsub;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+@Data
+public class Broker {
+ private List topics = new ArrayList<>();
+
+ void publish(String topic, TopicMessage topicMessage) {
+ topics.stream()
+ .filter(tp -> tp.getName().equals(topic))
+ .forEach(tp -> tp.produce(topicMessage));
+ }
+
+ public void createTopic(String name) {
+ topics.addLast(new Topic(name, new ArrayList<>(), new ArrayList<>(), new HashMap<>()));
+ }
+
+ public void addSubscriber(String topicName, TopicSubscriber topicSubscriber) {
+ synchronized (topics) {
+ topics.stream()
+ .filter(t -> t.getName().equalsIgnoreCase(topicName))
+ .forEach(t -> t.addSubscriber(topicSubscriber));
+ }
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/pubsub/Producer.java b/low-level-design/src/main/java/com/thealgorithm/pubsub/Producer.java
new file mode 100644
index 0000000..251824a
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/pubsub/Producer.java
@@ -0,0 +1,34 @@
+package com.thealgorithm.pubsub;
+
+import java.util.List;
+import lombok.AllArgsConstructor;
+
+@AllArgsConstructor
+public class Producer extends Thread {
+ private String producerId;
+ private Broker broker;
+ private List topicNames;
+
+ void produceMessage(String topicName, String msg) {
+ broker.publish(topicName, new TopicMessage(producerId, msg));
+ }
+
+ @Override
+ public void run() {
+ while (true) {
+ for (int i = 0; i < topicNames.size(); ++i) {
+ produceMessage(topicNames.get(i), RandomMessageGenerator.getMessage());
+ sleep0(100);
+ }
+ sleep0(500);
+ }
+ }
+
+ private static void sleep0(long time) {
+ try {
+ Thread.sleep(time);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/pubsub/RandomMessageGenerator.java b/low-level-design/src/main/java/com/thealgorithm/pubsub/RandomMessageGenerator.java
new file mode 100644
index 0000000..66d16c5
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/pubsub/RandomMessageGenerator.java
@@ -0,0 +1,17 @@
+package com.thealgorithm.pubsub;
+
+import java.util.Random;
+
+public class RandomMessageGenerator {
+ private static final Random RANDOM = new Random();
+ private static final String SET = "abcd efghi jklmn op q r stuv qxyz 124 56 789 0";
+
+ public static String getMessage() {
+ int len = RANDOM.nextInt(10);
+ StringBuilder stringBuilder = new StringBuilder();
+ for (int i = 0; i < len; ++i) {
+ stringBuilder.append(SET.charAt(RANDOM.nextInt(SET.length())));
+ }
+ return stringBuilder.toString();
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/pubsub/Test.java b/low-level-design/src/main/java/com/thealgorithm/pubsub/Test.java
new file mode 100644
index 0000000..b957e5a
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/pubsub/Test.java
@@ -0,0 +1,32 @@
+package com.thealgorithm.pubsub;
+
+import java.util.List;
+
+public class Test {
+ public static void main(String[] args) {
+ Broker broker = new Broker();
+ broker.createTopic("topic_1");
+
+ TopicSubscriber sub2 = TopicSubscriber.builder().subId("1247").subscriberId("sub2").build();
+ TopicSubscriber sub1 = TopicSubscriber.builder().subId("1245").subscriberId("sub1").build();
+ TopicSubscriber sub11 = TopicSubscriber.builder().subId("1246").subscriberId("sub1").build();
+ broker.addSubscriber(
+ "topic_1", sub1);
+ broker.addSubscriber(
+ "topic_1", sub11);
+ broker.addSubscriber(
+ "topic_1", sub2);
+
+ sub1.start();
+ sub11.start();
+ sub2.start();
+
+ Producer producer1 = new Producer("prod_1", broker, List.of("topic_1"));
+ Producer producer2 = new Producer("prod_1", broker, List.of("topic_1"));
+ Producer producer3 = new Producer("prod_1", broker, List.of("topic_1"));
+
+ producer1.start();
+ producer2.start();
+ producer3.start();
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/pubsub/Topic.java b/low-level-design/src/main/java/com/thealgorithm/pubsub/Topic.java
new file mode 100644
index 0000000..07f9768
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/pubsub/Topic.java
@@ -0,0 +1,38 @@
+package com.thealgorithm.pubsub;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+public class Topic {
+ @Getter private String name;
+ private List messages;
+ private List subscribers;
+ @Builder.Default private Map subscriberVsOffset = new ConcurrentHashMap<>();
+
+ public synchronized void produce(TopicMessage topicMessage) {
+ this.messages.addLast(topicMessage);
+ }
+
+ public List fetchMessageForSubscriber(TopicSubscriber topicSubscriber) {
+ subscriberVsOffset.putIfAbsent(topicSubscriber.getSubscriberId(), 0);
+ Integer offset = subscriberVsOffset.get(topicSubscriber.getSubscriberId());
+ List topicMessages = new ArrayList<>();
+ for (int i = offset + 1; i < messages.size(); ++i) {
+ topicMessages.addLast(messages.get(i));
+ }
+ subscriberVsOffset.put(topicSubscriber.getSubscriberId(), messages.size() - 1);
+ return topicMessages;
+ }
+
+ public void addSubscriber(TopicSubscriber topicSubscriber) {
+ synchronized (subscribers) {
+ this.subscribers.addLast(topicSubscriber);
+ topicSubscriber.setTopic(this);
+ }
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/pubsub/TopicMessage.java b/low-level-design/src/main/java/com/thealgorithm/pubsub/TopicMessage.java
new file mode 100644
index 0000000..2cd3b58
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/pubsub/TopicMessage.java
@@ -0,0 +1,11 @@
+package com.thealgorithm.pubsub;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class TopicMessage {
+ private String producer;
+ private String data;
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/pubsub/TopicSubscriber.java b/low-level-design/src/main/java/com/thealgorithm/pubsub/TopicSubscriber.java
new file mode 100644
index 0000000..f96b0c1
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/pubsub/TopicSubscriber.java
@@ -0,0 +1,36 @@
+package com.thealgorithm.pubsub;
+
+import java.util.List;
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class TopicSubscriber extends Thread {
+ private Topic topic;
+ private String subId;
+ private String subscriberId;
+
+ // private AtomicInteger recievedCount = new AtomicInteger(0);
+
+ public void pull() {
+ List topicMessages = topic.fetchMessageForSubscriber(this);
+ // recievedCount.set(recievedCount.get() + topicMessages.size());
+ topicMessages.forEach(
+ m ->
+ System.out.printf(
+ "%s from %s by %s - %s\n", subscriberId, topic.getName(), subId, m.getData()));
+ }
+
+ @Override
+ public void run() {
+ while (true) {
+ pull();
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/sudoku/SudokuBoard.java b/low-level-design/src/main/java/com/thealgorithm/sudoku/SudokuBoard.java
new file mode 100644
index 0000000..c5d10c8
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/sudoku/SudokuBoard.java
@@ -0,0 +1,3 @@
+package com.thealgorithm.sudoku;
+
+public class SudokuBoard {}
diff --git a/low-level-design/src/main/java/com/thealgorithm/sudoku/SudokuGame.java b/low-level-design/src/main/java/com/thealgorithm/sudoku/SudokuGame.java
new file mode 100644
index 0000000..ceddaba
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/sudoku/SudokuGame.java
@@ -0,0 +1,9 @@
+package com.thealgorithm.sudoku;
+
+public class SudokuGame {
+ private SudokuBoard sudokuBoard;
+
+ public void play() {
+
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/visitor/DeluxRoom.java b/low-level-design/src/main/java/com/thealgorithm/visitor/DeluxRoom.java
new file mode 100644
index 0000000..d8454cb
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/visitor/DeluxRoom.java
@@ -0,0 +1,8 @@
+package com.thealgorithm.visitor;
+
+public class DeluxRoom implements Room{
+ @Override
+ public void accept(RoomVisitor roomVisitor) {
+ roomVisitor.visit(this);
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/visitor/Main.java b/low-level-design/src/main/java/com/thealgorithm/visitor/Main.java
new file mode 100644
index 0000000..c9e8a6d
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/visitor/Main.java
@@ -0,0 +1,9 @@
+package com.thealgorithm.visitor;
+
+public class Main {
+ public static void main(String[] args) {
+ DeluxRoom deluxRoom = new DeluxRoom();
+ RoomCleaner roomCleaner = new RoomCleaner();
+ deluxRoom.accept(roomCleaner);
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/visitor/Room.java b/low-level-design/src/main/java/com/thealgorithm/visitor/Room.java
new file mode 100644
index 0000000..6176602
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/visitor/Room.java
@@ -0,0 +1,5 @@
+package com.thealgorithm.visitor;
+
+public interface Room {
+ void accept(RoomVisitor roomVisitor);
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/visitor/RoomCleaner.java b/low-level-design/src/main/java/com/thealgorithm/visitor/RoomCleaner.java
new file mode 100644
index 0000000..8410b61
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/visitor/RoomCleaner.java
@@ -0,0 +1,12 @@
+package com.thealgorithm.visitor;
+
+public class RoomCleaner implements RoomVisitor {
+ @Override
+ public void visit(Room room) {
+ if (room instanceof DeluxRoom) {
+ System.out.println("Charge 400");
+ } else {
+ System.out.println("Charge 200");
+ }
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/visitor/RoomVisitor.java b/low-level-design/src/main/java/com/thealgorithm/visitor/RoomVisitor.java
new file mode 100644
index 0000000..2ef2c44
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/visitor/RoomVisitor.java
@@ -0,0 +1,5 @@
+package com.thealgorithm.visitor;
+
+public interface RoomVisitor {
+ void visit(Room room);
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/votingsystem/Candidate.java b/low-level-design/src/main/java/com/thealgorithm/votingsystem/Candidate.java
new file mode 100644
index 0000000..80b5c3c
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/votingsystem/Candidate.java
@@ -0,0 +1,14 @@
+package com.thealgorithm.votingsystem;
+
+import lombok.Data;
+import lombok.Getter;
+
+@Getter
+public class Candidate extends Citizen {
+ private Party party;
+
+ public Candidate(String name, String voterId, Party party) {
+ super(name, voterId, null);
+ this.party = party;
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/votingsystem/Citizen.java b/low-level-design/src/main/java/com/thealgorithm/votingsystem/Citizen.java
new file mode 100644
index 0000000..095c4c8
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/votingsystem/Citizen.java
@@ -0,0 +1,18 @@
+package com.thealgorithm.votingsystem;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@AllArgsConstructor
+public class Citizen {
+ private String name;
+ private String voterId;
+ private Candidate choosenCandidate;
+
+ public Vote castVote() {
+ return new Vote(choosenCandidate);
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/votingsystem/ConstituencyVoteBank.java b/low-level-design/src/main/java/com/thealgorithm/votingsystem/ConstituencyVoteBank.java
new file mode 100644
index 0000000..4411f59
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/votingsystem/ConstituencyVoteBank.java
@@ -0,0 +1,23 @@
+package com.thealgorithm.votingsystem;
+
+import java.util.Map;
+
+public class ConstituencyVoteBank extends VoteBank {
+ private ConstituencyVotingSystem constituencyVotingSystem;
+
+ public ConstituencyVoteBank(
+ VoteBank parent,
+ Map snapShot,
+ ConstituencyVotingSystem constituencyVotingSystem) {
+
+ super(parent, snapShot);
+ this.constituencyVotingSystem = constituencyVotingSystem;
+ }
+
+ @Override
+ public void getFromChildren(Map snapShot) {
+ super.setSnapShot(constituencyVotingSystem.collectVote());
+ updateToParent();
+ declareWinner();
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/votingsystem/ConstituencyVotingSystem.java b/low-level-design/src/main/java/com/thealgorithm/votingsystem/ConstituencyVotingSystem.java
new file mode 100644
index 0000000..d78b36b
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/votingsystem/ConstituencyVotingSystem.java
@@ -0,0 +1,22 @@
+package com.thealgorithm.votingsystem;
+
+import java.util.List;
+import java.util.Map;
+
+public class ConstituencyVotingSystem implements VotingSystem {
+ private List candidates;
+ private List citizens;
+ private Map voteCount;
+
+ @Override
+ public Map collectVote() {
+ for (Citizen citizen : citizens) {
+ Vote vote = citizen.castVote();
+ Candidate candidate = vote.getCandidate();
+ if (candidate != null) {
+ voteCount.put(candidate.getParty(), 1 + voteCount.getOrDefault(candidate.getParty(), 0));
+ }
+ }
+ return voteCount;
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/votingsystem/CountryVoteBank.java b/low-level-design/src/main/java/com/thealgorithm/votingsystem/CountryVoteBank.java
new file mode 100644
index 0000000..ae6c5d8
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/votingsystem/CountryVoteBank.java
@@ -0,0 +1,10 @@
+package com.thealgorithm.votingsystem;
+
+import java.util.Map;
+
+public class CountryVoteBank extends VoteBank {
+ public CountryVoteBank(
+ VoteBank parent, Map snapShot) {
+ super(parent, snapShot);
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/votingsystem/DistrictVoteBank.java b/low-level-design/src/main/java/com/thealgorithm/votingsystem/DistrictVoteBank.java
new file mode 100644
index 0000000..c288abf
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/votingsystem/DistrictVoteBank.java
@@ -0,0 +1,10 @@
+package com.thealgorithm.votingsystem;
+
+import java.util.Map;
+
+public class DistrictVoteBank extends VoteBank {
+ public DistrictVoteBank(
+ VoteBank parent, Map snapShot) {
+ super(parent, snapShot);
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/votingsystem/MagicFigureWinningStrategy.java b/low-level-design/src/main/java/com/thealgorithm/votingsystem/MagicFigureWinningStrategy.java
new file mode 100644
index 0000000..13f0dc3
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/votingsystem/MagicFigureWinningStrategy.java
@@ -0,0 +1,3 @@
+package com.thealgorithm.votingsystem;
+
+public class MagicFigureWinningStrategy {}
diff --git a/low-level-design/src/main/java/com/thealgorithm/votingsystem/Party.java b/low-level-design/src/main/java/com/thealgorithm/votingsystem/Party.java
new file mode 100644
index 0000000..a29378e
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/votingsystem/Party.java
@@ -0,0 +1,15 @@
+package com.thealgorithm.votingsystem;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+@AllArgsConstructor
+public class Party {
+ private String name;
+ private List candidates;
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/votingsystem/SimpleWinningStrategy.java b/low-level-design/src/main/java/com/thealgorithm/votingsystem/SimpleWinningStrategy.java
new file mode 100644
index 0000000..d636028
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/votingsystem/SimpleWinningStrategy.java
@@ -0,0 +1,23 @@
+package com.thealgorithm.votingsystem;
+
+public class SimpleWinningStrategy extends WinningStrategy {
+
+ public SimpleWinningStrategy(VoteBank voteBank) {
+ super(voteBank);
+ }
+
+ @Override
+ public Party whoWin() {
+ VoteBank voteBank = super.getVoteBank();
+ return voteBank.getSnapShot().entrySet().stream()
+ .reduce(
+ (pe1, pe2) -> {
+ if (pe1.getValue() > pe2.getValue()) {
+ return pe1;
+ }
+ return pe2;
+ })
+ .orElseThrow()
+ .getKey();
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/votingsystem/StateVoteBank.java b/low-level-design/src/main/java/com/thealgorithm/votingsystem/StateVoteBank.java
new file mode 100644
index 0000000..9035c80
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/votingsystem/StateVoteBank.java
@@ -0,0 +1,10 @@
+package com.thealgorithm.votingsystem;
+
+import java.util.Map;
+
+public class StateVoteBank extends VoteBank {
+ public StateVoteBank(
+ VoteBank parent, Map snapShot) {
+ super(parent, snapShot);
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/votingsystem/Test.java b/low-level-design/src/main/java/com/thealgorithm/votingsystem/Test.java
new file mode 100644
index 0000000..36f54b4
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/votingsystem/Test.java
@@ -0,0 +1,15 @@
+package com.thealgorithm.votingsystem;
+
+import java.util.HashMap;
+
+public class Test {
+ public static void main(String[] args) {
+ VoteBank countryVoteBank = new CountryVoteBank(null, new HashMap<>());
+ VoteBank westBengal = new StateVoteBank(countryVoteBank, new HashMap<>());
+ VoteBank howrahVoteBank = new DistrictVoteBank(westBengal, new HashMap<>());
+ ConstituencyVoteBank amtaVoteBank =
+ new ConstituencyVoteBank(howrahVoteBank, new HashMap<>(), new ConstituencyVotingSystem());
+
+
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/votingsystem/Vote.java b/low-level-design/src/main/java/com/thealgorithm/votingsystem/Vote.java
new file mode 100644
index 0000000..188fe4c
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/votingsystem/Vote.java
@@ -0,0 +1,12 @@
+package com.thealgorithm.votingsystem;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@AllArgsConstructor
+public class Vote {
+ private Candidate candidate;
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/votingsystem/VoteBank.java b/low-level-design/src/main/java/com/thealgorithm/votingsystem/VoteBank.java
new file mode 100644
index 0000000..f2f865e
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/votingsystem/VoteBank.java
@@ -0,0 +1,41 @@
+package com.thealgorithm.votingsystem;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Setter
+@Getter
+public abstract class VoteBank {
+ private VoteBank parent;
+ private Map snapShot;
+ private WinningStrategy winningStrategy;
+// private Map winCount;
+
+ public VoteBank(VoteBank parent, Map snapShot) {
+ this.parent = parent;
+ this.snapShot = snapShot;
+ //this.winningStrategy = winningStrategy;
+ //this.winCount = new HashMap<>();
+ }
+
+ public void updateToParent() {
+ parent.getFromChildren(this.snapShot);
+ }
+
+ public synchronized void getFromChildren(Map snapShot) {
+ snapShot.forEach(
+ (party, count) -> {
+ this.snapShot.put(party, this.snapShot.getOrDefault(party, 0) + count);
+ });
+ updateToParent();
+ declareWinner();
+ }
+
+ public void declareWinner() {
+ Party party = winningStrategy.whoWin();
+ System.out.println("Won by " + party.getName());
+ }
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/votingsystem/VotingSystem.java b/low-level-design/src/main/java/com/thealgorithm/votingsystem/VotingSystem.java
new file mode 100644
index 0000000..d479c96
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/votingsystem/VotingSystem.java
@@ -0,0 +1,7 @@
+package com.thealgorithm.votingsystem;
+
+import java.util.Map;
+
+public interface VotingSystem {
+ Map collectVote();
+}
diff --git a/low-level-design/src/main/java/com/thealgorithm/votingsystem/WinningStrategy.java b/low-level-design/src/main/java/com/thealgorithm/votingsystem/WinningStrategy.java
new file mode 100644
index 0000000..ee23174
--- /dev/null
+++ b/low-level-design/src/main/java/com/thealgorithm/votingsystem/WinningStrategy.java
@@ -0,0 +1,15 @@
+package com.thealgorithm.votingsystem;
+
+
+import lombok.Getter;
+
+@Getter
+public abstract class WinningStrategy {
+ private VoteBank voteBank;
+
+ public WinningStrategy(VoteBank voteBank) {
+ this.voteBank = voteBank;
+ }
+
+ public abstract Party whoWin();
+}
diff --git a/low-level-design/src/main/resources/lld_diagrams/Cache_LLD.png b/low-level-design/src/main/resources/lld_diagrams/Cache_LLD.png
new file mode 100644
index 0000000..f5e8489
Binary files /dev/null and b/low-level-design/src/main/resources/lld_diagrams/Cache_LLD.png differ