Holy Theory

  1. Binary search
  2. Binary tree in order traversal
  3. Binary tree postorder traversal
  4. Binary tree preorder traversal
  5. Bubble sort
  6. Diffie hellman algorithm
  7. Graph adjacency list
  8. Graph adjacency matrix
  9. Insertion sort
  10. Interpolation search
  11. Merge sort
  12. Pairwise
  13. Quicksort
  14. Selection sort
  15. Symmetric difference
  16. Array length property
  17. Different ways of declaring functions in JS
  18. Event Loop
  19. JavaScript data types
  20. JavaScript number size summary
  21. JavaScript Arrays cheat sheet
  22. Possible types of function in JavaScript
  23. Promise action flow

Binary search

Binary search

Steps:

Time Complexity:
Worst case: O(log n)
Average case: O(log n)
Best case: O(1)

function binarySearch(nums: number[], target: number): number {
let left: number = 0;
let right: number = nums.length - 1;

while (left <= right) {
const mid: number = Math.floor((left + right) / 2);

if (nums[mid] === target) return mid;
if (target < nums[mid]) right = mid - 1;
else left = mid + 1;
}

return -1;
}

class Solution {
private static int binarySearch(int[] array, int target) {

int low = 0;
int high = array.length - 1;

while(low <= high) {
int middle = low + (high - low) / 2;
int value = array[middle];

if(value < target) {
low = middle + 1;
} else if(value > target) {
high = middle - 1;

} else {
return middle;
}
}
return -1;
}
}

Binary tree in order traversal

class Solution {


List<Integer> getInOrderTraversal(Node root) {
List<Integer> list = new ArrayList<Integer>();
Stack<Node> stack = new Stack<>();
Node node = root;

while(node != null || !stack.isEmpty()) {
while(node != null) {
stack.push(node);
node = node.left;
}
list.add(stack.peek().data);
node = stack.pop().right;
}

return list;
}
}

Binary tree postorder traversal

class Solution {

void utility(Node root, List<Integer> traversal) {
if(root == null) {
return;
}

utility(root.left, traversal);
utility(root.right, traversal);
traversal.add(root.data);

}

List<Integer> getPostorderTraversal(Node root) {
List<Integer> traversal = new ArrayList<Integer>();
utility(root, traversal);
return traversal;
}
}

Binary tree preorder traversal

class Solution {

void utility(Node root, List<Integer> traversal) {
if(root == null) {
return;
}

traversal.add(root.data);
utility(root.left, traversal);
utility(root.right, traversal);
}

List<Integer> getPreorderTraversal(Node root) {
List<Integer> traversal = new ArrayList<Integer>();
utility(root, traversal);
return traversal;
}
}

Bubble sort

function bubbleSort(array: number[] | string[]) {
for (let i = 0; i < array.length; i++) {
for (let j = 0; j < array.length - 1 - i; j++) {
if (array[j] > array[j + 1]) {
[array[j], array[j + 1]] = [array[j + 1], array[j]];
}
}
}
return array;
}

console.log(bubbleSort([2,5,2,6,7,2,22,5,7,9,0,2,3]))
	public static void bubbleSort(int[] array) {
for(int i = 0; i < array.length - 1; i++) {
for(int j = 0; j < array.length - i - 1; j++) {
if(array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}

Diffie hellman algorithm

function power(a: any, b: any, p: any) {
if(b === 1) {
return 1
} else {
return Math.pow(a,b) % p
}
}


function DiffieHellman() {

let P, G, x, a, y, b, ka, kb;

P = 23

console.log("The value of P :", P);

G = 9;

console.log("The value of G :", G);

a = 4;

console.log("The private key a for Alice : ", a);

x = power(G,a,P);

b = 3;

console.log("The private key a for Bob : ", b);

y = power(G,b,P);


ka = power(y, a, P);
kb = power(x, b, P);

console.log("Secret key for the Alice is : ", ka);
console.log("Secret key for the Bob is : ", kb);
}


DiffieHellman()

Graph adjacency list


public class GraphList {

ArrayList<LinkedList<Node>> alist;


GraphList() {
alist = new ArrayList<>();
}

public void addNode(Node node) {
LinkedList<Node> currentList = new LinkedList<>();
currentList.add(node);
alist.add(currentList);
}

public void addEdge(int src, int dst) {
LinkedList<Node> currentList = alist.get(src);
Node dstNode = alist.get(dst).get(0);
currentList.add(dstNode);

}
public boolean checkEdge(int src, int dst) {
LinkedList<Node> currentList = alist.get(src);
Node dstNode = alist.get(dst).get(0);

for(Node node: currentList) {
if(node == dstNode) {
return true;
}
}
return false;

}

public void print() {
for(LinkedList<Node> currentList : alist) {
for(Node node: currentList) {
System.out.print(node.data + " -> ");
}
System.out.println();
}
}
}

Graph adjacency matrix

public class Graph {
ArrayList<Node> nodes;
int[][] matrix;

Graph(int size) {
nodes = new ArrayList<>();
matrix = new int[size][size];
}

public void addNode(Node node) {
nodes.add(node);
}

public void addEdge(int src, int dst) {
matrix[src][dst] = 1;
}

public boolean checkEdge(int src, int dst) {
if(matrix[src][dst] == 1) {
return true;
} else {
return false;
}
}

public void print() {
System.out.print(" ");
for(Node node : nodes) {
System.out.print(node.data + " ");
}
System.out.println();

for(int i = 0; i < matrix.length; i++) {
System.out.print(nodes.get(i).data + " ");
for(int j =0; j < matrix[i].length; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
}
}

Insertion sort

TypeScript

function insertionSort(array: number[] | string[]) {
for (let i = 1; i < array.length; i++) {
let curr = array[i];
let j = i - 1;
for (j; j >= 0 && array[j] > curr; j--) {
array[j + 1] = array[j];
}
array[j + 1] = curr;
}
return array;
}

console.log(insertionSort([1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92]));

Java

    class Solution {
void insertionSort (int[] arr) {
int n = arr.length;
for(int i = 1; i < n; i++) {
int current = arr[i];
int position = i - 1;
while(position >= 0 && arr[position] > current) {
arr[position + 1] = arr[position];
position--;
}
arr[position + 1] = current;
}
}
}

Interpolation search

class Solution {

private static int interpolationSearch(int[] array, int value) {
int low = 0;
int high = array.length - 1;

while(value >=array[low] && value <= array[high] && low <= high) {
int probe = low + (high - low) * (value - array[low]) / (array[high] - array[low]);
if(array[probe] == value) {
return probe;
} else if(array[probe] > value) {
low = probe + 1;
} else {
high = probe -1;
}

}

return -1;
}

}

Merge sort

Java

class Solution {

void merge(int[] arr, int low, int mid, int high) {
int subArr1Size = mid - low + 1;
int subArr2Size = high - mid;

int [] subArr1 = new int[subArr1Size];
int [] subArr2 = new int[subArr2Size];

for (int i = 0; i < subArr1Size; i++) {
subArr1[i] = arr[low + i];
}
for (int i = 0; i < subArr2Size; i++) {
subArr2[i] = arr[mid + 1 + i];
}
int i = 0, j = 0, k = low;

while(i < subArr1Size && j < subArr2Size) {
if(subArr1[i] <= subArr2[j]) {
arr[k] = subArr1[i];
i++;
} else {
arr[k] = subArr2[j];
j++;
}
k++;
}
while(i < subArr1Size) {
arr[k++] = subArr1[i++];
}
while (j < subArr2Size) {
arr[k++] = subArr2[j++];
}
}

void mergesort(int[] arr, int low, int high){
if(high > low) {
int mid = (high + low) / 2;
mergesort(arr, low, mid);
mergesort(arr, mid + 1, high);
merge(arr, low, mid, high);
}
}

void mergeSort (int[] arr) {
int n = arr.length;
mergesort(arr, 0, n - 1);
}
}

Pairwise

export function pairwise(arr:number[], arg:number) {
const index = [];

for (let a in arr) {
let temp = arr[a];

for (let i = 1; i < arr.length; i++) {
let temp2 = arr[i];
if (temp + temp2 === arg && i > +a && index.indexOf(+a) === -1 && index.indexOf(+i) === -1) {
index.push(+a, +i);
break;
}
}
}
if (index.length >= 1) {
const addAll = (a: any, b: any) => {
return a + b;
};

return index.reduce(addAll);
} else
return 0;
}

let res = pairwise([1, 3, 2, 4], 4);
console.log(res);

Quicksort

class Solution {

int makePartition(int [] arr, int low, int high) {
int pivot = arr[high];
int currentIndex = low - 1;
for(int i = low; i < high; i++) {
if(arr[i] < pivot) {
currentIndex++;
int temp = arr[i];
arr[i] = arr[currentIndex];
arr[currentIndex] = temp;
}

}
int temp = arr[high];
arr[high] = arr[currentIndex + 1];
arr[currentIndex + 1] = temp;
return currentIndex + 1;
}

void quicksort(int[] arr, int low, int high) {
if(low < high) {
int pivot = makePartition(arr, low, high);
quicksort(arr, low, pivot - 1);
quicksort(arr, pivot + 1, high);
}
}

void quickSort (int[] arr) {
int n = arr.length;
quicksort(arr, 0, n - 1);
}
}
def quicksort(arr):
if len(arr) < 2:
return arr
else:
pivot = arr[len(arr)/2]
less = [i for i in arr[1:] if i <= pivot]
greater = [i for i in arr[1:] if i > pivot]
return quicksort(less) + [pivot] + quicksort(greater)

print(quicksort([10,2,3,1,5,4]))
class Solution {
static void swap(int[] array, int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}

private static void quickSort(int[] array, int start, int end) {
if(end <= start) return; // base case

int pivot = partition(array, start, end);

quickSort(array, start, pivot -1);
quickSort(array, pivot + 1, end);
}

private static int partition(int[] array, int start, int end) {
int pivot = array[end];

int i = start - 1;

for(int j = start; j <= end -1; j++) {
if(array[j] < pivot) {
i++;
swap(array, i, j);
}
}
i++;
swap(array, i, end);

return i;
}
}

Selection sort

function selectionSort(array: any[]) {
for (let i = 0; i < array.length - 1; i++) {
let min = i;
for (let j = i + 1; j < array.length; j++) {
if (array[min] > array[j]) min = j;
}
[array[i], array[min]] =[array[min], array[i]]
}
return array;
}

console.log(selectionSort([1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92]));
	public static void selectionSort(int[] array) {
for(int i = 0; i < array.length - 1; i++) {
int min = i;
for(int j = i + 1; j < array.length; j++) {
if(array[min] > array[j]) {
min = j;
}
}
int temp = array[i];
array[i] = array[min];
array[min] = temp;
}
}

Symmetric difference

export const symmetricDifference = (...args: any) => [...new Set(args.reduce((arr1: any, arr2: any) => [
...arr1.filter((e: any) => !arr2.includes(e)),
...arr2.filter((e: any) => !arr1.includes(e))
]))];

Array length property

What is the value of clothes[0]:

const clothes = ['jacket', 't-shirt'];
clothes.length = 0;
clothes[0];

Reducing the value of the length property has the side-effect of deleting own array elements whose array index is between the old and new length values.
https://262.ecma-international.org/6.0/#sec-properties-of-array-instances-length

As result when JavaScript executes clothes.length = 0, all clothes items are deleted.

clothes[0] is undefined, because clothes array has been emptied.

Different ways of declaring functions in JS

Different ways of declaring functions in JS

Event Loop

Event Loop

JavaScript data types

JavaScript data types

JavaScript number size summary

JavaScript number size summary

JavaScript Arrays cheat sheet

JavaScript Arrays cheat sheet

Possible types of function in JavaScript

Possible types of function in JavaScript

Promise action flow

Promise action flow