--- # DSA - Phạm Thị Diễm Quỳnh - 21020087 ## [BT2](https://www.hackerrank.com/domains/java?filters%5Bsubdomains%5D%5B%5D=java-introduction) ### 1. [Welcome to Java!](https://www.hackerrank.com/challenges/welcome-to-java/problem?isFullScreen=true) ```java public class Solution { public static void main(String[] args) { System.out.println("Hello, World."); System.out.println("Hello, Java."); } } ``` ### 2. [ Java Stdin and Stdout I](https://www.hackerrank.com/challenges/java-stdin-and-stdout-1/problem?isFullScreen=true) ```java import java.util.*; public class Solution { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int a = scan.nextInt(); int b = scan.nextInt(); int c = scan.nextInt(); System.out.println(a); System.out.println(b); System.out.println(c); } } ``` ### 3. [Java If-Else](https://www.hackerrank.com/challenges/java-if-else/problem?isFullScreen=true) ```java public class Solution { private static final Scanner scanner = new Scanner(System.in); public static void main(String[] args) { int N = scanner.nextInt(); scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?"); if(N % 2 == 1 || (N % 2 == 0 && 6 <= N && N <= 20)) { System.out.print("Weird"); } else System.out.print("Not Weird"); scanner.close(); } } ``` ### 4. [Java Stdin and Stdout II](https://www.hackerrank.com/challenges/java-stdin-stdout/problem?isFullScreen=true) ```java import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int i = scan.nextInt(); double d = scan.nextDouble(); String s = scan.nextLine(); s = scan.nextLine(); System.out.println("String: " + s); System.out.println("Double: " + d); System.out.println("Int: " + i); } } ``` ### 5. [Java Output Formatting](https://www.hackerrank.com/challenges/java-output-formatting/problem?isFullScreen=true) ```java import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("================================"); for(int i=0;i<3;i++){ String s1 = sc.next(); while(s1.length() < 15) s1 += ' '; int x = sc.nextInt(); String s2 = new String(); while(x > 0) { s2 = x % 10 + s2; x = x / 10; } while(s2.length() < 3) s2 = '0' + s2; System.out.printf(s1); System.out.println(s2); } System.out.println("================================"); } } ``` ### 6. [Java Loops I](https://www.hackerrank.com/challenges/java-loops-i/problem?isFullScreen=true) ```java public class Solution { public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(bufferedReader.readLine().trim()); for(int i = 1; i <= 10; ++i) { String ans = new String(); ans = N + " x " + i; ans += " = "; ans += N * i; System.out.println(ans); } bufferedReader.close(); } } ``` ### 7. [Java Loops II](https://www.hackerrank.com/challenges/java-loops/problem?isFullScreen=true) ```java import java.util.*; import java.io.*; class Solution{ public static void main(String []argh){ Scanner in = new Scanner(System.in); int t=in.nextInt(); for(int i = 0; i < t; i++){ int a = in.nextInt(); int b = in.nextInt(); int n = in.nextInt(); int cur = a; int cur2 = 1; for(int j = 0; j < n; ++j) { cur += cur2 * b; cur2 *= 2; System.out.print(cur); System.out.printf(" "); } System.out.println(); } in.close(); } } ``` ### 8. [Java Datatypes](https://www.hackerrank.com/challenges/java-datatypes/problem?isFullScreen=true) ```java class Solution{ public static void main(String []argh) { Scanner sc = new Scanner(System.in); int t=sc.nextInt(); for(int i=0;i<t;i++) { try { long x=sc.nextLong(); System.out.println(x+" can be fitted in:"); if(x>=-128 && x<=127)System.out.println("* byte"); if(x >= -(1 << 15) && x <= (1 << 15) - 1) System.out.println("* short"); if(x >= -(1 << 31) && x <= (1 << 31) - 1) System.out.println("* int"); if(x >= -(1L << 63) && x <= (1L << 63) - 1) System.out.println("* long"); } catch(Exception e) { System.out.println(sc.next()+" can't be fitted anywhere."); } } } } ``` ### 9. [Java End-of-file](https://www.hackerrank.com/challenges/java-end-of-file/problem?isFullScreen=true) ```java public class Solution { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int id = 0; while(sc.hasNext()) { ++id; System.out.println(id + " " + sc.nextLine()); } } } ``` ### 10. [Java Static Initializer Block](https://www.hackerrank.com/challenges/java-static-initializer-block/problem?isFullScreen=true) ```java public class Solution { static Scanner scan = new Scanner(System.in); static int B; static int H; static boolean flag; static{ B = scan.nextInt(); H = scan.nextInt(); try{ if(B > 0 && H > 0) { flag = true; } else{ flag = false; throw new Exception("Breadth and height must be positive"); } } catch(Exception e){ System.out.println(e); } } public static void main(String[] args){ if(flag){ int area=B*H; System.out.print(area); } }//end of main }//end of class ``` ### 11. [Java Int to String](https://www.hackerrank.com/challenges/java-int-to-string/problem?isFullScreen=true) ```java import java.util.*; import java.security.*; public class Solution { public static void main(String[] args) { DoNotTerminate.forbidExit(); try { Scanner in = new Scanner(System.in); int n = in .nextInt(); in.close(); //String s=???; Complete this line below String s = Integer.toString(n); if (n == Integer.parseInt(s)) { System.out.println("Good job"); } else { System.out.println("Wrong answer."); } } catch (DoNotTerminate.ExitTrappedException e) { System.out.println("Unsuccessful Termination!!"); } } } //The following class will prevent you from terminating the code using exit(0)! class DoNotTerminate { public static class ExitTrappedException extends SecurityException { private static final long serialVersionUID = 1; } public static void forbidExit() { final SecurityManager securityManager = new SecurityManager() { @Override public void checkPermission(Permission permission) { if (permission.getName().contains("exitVM")) { throw new ExitTrappedException(); } } }; System.setSecurityManager(securityManager); } } ``` ### 12. [Java Date and Tim](https://www.hackerrank.com/challenges/java-date-and-time/problem?isFullScreen=true) ```java class Result { public static String findDay(int month, int day, int year) { Calendar calendar = new GregorianCalendar(year, month-1, day); return calendar.getDisplayName(calendar.DAY_OF_WEEK, calendar.LONG, Locale.US).toUpperCase(); } } ``` ### 13. [Java Currency Formatter](https://www.hackerrank.com/challenges/java-currency-formatter/problem?isFullScreen=true&h_r=next-challenge&h_v=zen) ```java public class Solution { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); double payment = scanner.nextDouble(); scanner.close(); // Write your code here. String us = NumberFormat.getCurrencyInstance(Locale.US).format(payment); String india = NumberFormat.getCurrencyInstance(new Locale ("en", "IN")).format(payment); String china = NumberFormat.getCurrencyInstance(Locale.CHINA).format(payment); String france = NumberFormat.getCurrencyInstance(Locale.FRANCE).format(payment); System.out.println("US: " + us); System.out.println("India: " + india); System.out.println("China: " + china); System.out.println("France: " + france); } } ``` ## [BT3](https://www.hackerrank.com/domains/algorithms?filters%5Bsubdomains%5D%5B%5D=warmup) ### 1. [Solve Me First](https://www.hackerrank.com/challenges/solve-me-first/problem?isFullScreen=true) ```java public class Solution { static int solveMeFirst(int a, int b) { return a + b; } public static void main(String[] args) { Scanner in = new Scanner(System.in); int a; a = in.nextInt(); int b; b = in.nextInt(); int sum; sum = solveMeFirst(a, b); System.out.println(sum); } } ``` ### 2. [Simple Array Sum](https://www.hackerrank.com/challenges/simple-array-sum/copy-from/289149402) ```java class Result { public static int simpleArraySum(List<Integer> ar) { int sum = 0; for (int i = 0; i < ar.size(); ++i) { sum += ar.get(i); } return sum; } } ``` ### 3. [Compare the Triplets](hackerrank.com/challenges/compare-the-triplets/problem?isFullScreen=true) ```java class Result { public static List<Integer> compareTriplets(List<Integer> a, List<Integer> b) { List <Integer> score = new ArrayList<Integer>(); int alice = 0; int bob = 0; for (int i = 0; i < a.size(); i++) { if(a.get(i)>b.get(i)){ alice++; } else if(a.get(i)<b.get(i)){ bob++; } else { continue; } } score.add(alice); score.add(bob); return score; } } ``` ### 4. [A Very Big Sum](https://www.hackerrank.com/challenges/a-very-big-sum/problem?isFullScreen=true) ```java class Result { public static long aVeryBigSum(List<Long> ar) { long sum = 0; for (int i = 0; i < ar.size(); ++i) { sum += ar.get(i); } return sum; } } ``` ### 5. [Diagonal Difference](https://www.hackerrank.com/challenges/diagonal-difference/problem?isFullScreen=true) ```java class Result { public static int diagonalDifference(List<List<Integer>> arr) { int len = arr.size(); int left =0; int right =0; int j = 0, k = len - 1; for (int i = 0; i < len; i++) { left += arr.get(i).get(j); right += arr.get(i).get(k); j++; k--; } return Math.abs(left - right); } } ``` ### 6. [Staircase](https://www.hackerrank.com/challenges/staircase/problem?isFullScreen=true) ```java class Result { public static void staircase(int n) { for (int i = 1; i <= n; ++i) { for(int j = 1; j <= n - i; ++j) { System.out.print(' '); } for(int j = 1; j <= i; ++j) { System.out.print('#'); } System.out.println(); } } ``` ### 7. [Plus Minus](https://www.hackerrank.com/challenges/plus-minus/problem?isFullScreen=true) ```java class Result { public static void plusMinus(List<Integer> arr) { double count = 0; double count1 = 0; double count2 = 0; for(int i=0; i < arr.size(); i++){ if(arr.get(i) < 0){ count++; } else if(arr.get(i) > 0){ count1++; } else if(arr.get(i)==0){ count2++; } } System.out.format("%.6f",count1 / arr.size()); System.out.println(); System.out.format("%.6f",count / arr.size()); System.out.println(); System.out.format("%.6f",count2 / arr.size()); } } ``` ### 8. [Mini-Max Sum](https://www.hackerrank.com/challenges/mini-max-sum/problem?isFullScreen=true) ```java class Result { public static void miniMaxSum(List<Integer> arr) { long sum =0; for(Integer elemt : arr) sum += elemt; long min = sum, max = 0; for(Integer elemt : arr){ max = Math.max(max,sum-elemt); min = Math.min(min,sum-elemt); } System.out.print(min+" "+max); } } ``` ### 9. [Birthday Cake Candles](https://www.hackerrank.com/challenges/birthday-cake-candles/problem?isFullScreen=true) ```java class Result { public static int birthdayCakeCandles(List<Integer> candles) { Integer[] arr = candles.toArray(new Integer[candles.size()]); // find highest int high = 0; int highCounts = 0; for(int i = 0; i < arr.length ; i++) { if(arr[i] > high) high = arr[i]; } for(int a : arr) { if(a == high) highCounts++; } return highCounts; } } ``` ### 10. [Time Conversion](https://www.hackerrank.com/challenges/time-conversion/problem?isFullScreen=true) ```java class Result { public static String timeConversion(String s) { Integer hora = Integer.parseInt(s.substring(0,2)); if (s.contains("AM")) { if(hora == 12) { hora = 0; } } else { if (hora != 12) { hora +=12; } } return String.format("%02d", hora) + s.substring(2, s.length()-2); } } ``` ## [BT4](https://docs.google.com/document/d/1RgwRO_6J3RXtw3Zj4mIfEAJ3Q2HorNfQ3qx6_ge5tgs/edit) ### 2. [Arrays - DS](https://www.hackerrank.com/challenges/arrays-ds/problem) ```java class Result { public static List<Integer> reverseArray(List<Integer> a) { List<Integer> newArr = new ArrayList<>(); for (Integer val : a) { newArr.add(0, val); } return newArr; } } ``` ### 3. [2D Array - DS](https://www.hackerrank.com/challenges/2d-array/problem) ```java class Result { public static int hourglassSum(List<List<Integer>> arr) { int top1, top2, top3, center, bottom1, bottom2, bottom3, sum = -63; //(7*-9=-63): min value for(int i = 0; i < arr.size()-2; ++i) { for(int j = 0; j < arr.get(i).size()-2; ++j) { top1 = arr.get(i).get(j); top2 = arr.get(i).get(j+1); top3 = arr.get(i).get(j+2); center = arr.get(i+1).get(j+1); bottom1 = arr.get(i+2).get(j); bottom2 = arr.get(i+2).get(j+1); bottom3 = arr.get(i+2).get(j+2); int tempSum = sum; sum = top1+top2+top3+center+bottom1+bottom2+bottom3; if(tempSum > sum) { sum = tempSum; } } } return sum; } } ``` ### 4. [Sherlock and Array](https://www.hackerrank.com/challenges/sherlock-and-array/problem) ```java class Result { public static String balancedSums(List<Integer> arr) { int leftSum = 0; int sum = 0; // find the sum of all list elements for (Integer i : arr) { sum += i; } // equation is 2*leftSum = sum - j for (Integer j : arr) { if (2 * leftSum == sum - j) { return "YES"; } leftSum += j; } return "NO"; } } ``` ### 5. [Closest Numbers](https://www.hackerrank.com/challenges/closest-numbers/problem) ```java class Result { public static List<Integer> closestNumbers(List<Integer> arr) { Collections.sort(arr); List<Integer> answer = new ArrayList<>(); int minn = Integer.MAX_VALUE; for (int i = 1; i < arr.size(); i++) { if (minn > arr.get(i) - arr.get(i - 1)) { minn = arr.get(i) - arr.get(i - 1); answer.removeAll(answer); answer.add(arr.get(i - 1)); answer.add(arr.get(i)); } else if(minn == arr.get(i) - arr.get(i - 1)) { answer.add(arr.get(i - 1)); answer.add(arr.get(i)); } } return answer; } } ``` ### 6. [Pairs](https://www.hackerrank.com/challenges/pairs/problem) ```java class Result { public static int pairs(int k, List<Integer> arr) { int ans = 0; HashMap<Integer, Integer> mp = new HashMap<Integer, Integer>(); Collections.sort(arr); mp.put(arr.get(0), 1); for (int i = 1; i < arr.size(); i++) { if (mp.get(arr.get(i) - k) != null) { ans += mp.get(arr.get(i) - k); } if (mp.get(arr.get(i)) == null) { mp.put(arr.get(i), 1); } else { mp.put(arr.get(i), mp.get(arr.get(i)) + 1); } } return ans; } } ``` ### 7. [ThreeSum](https://docs.google.com/document/d/1RgwRO_6J3RXtw3Zj4mIfEAJ3Q2HorNfQ3qx6_ge5tgs/edit#) ```java public class Solution { private static boolean containsDuplicates(long[] a) { for (int i = 1; i < a.length; i++) if (a[i] == a[i-1]) return true; return false; } private static long count(long[] a) { int n = a.length; Arrays.sort(a); if (containsDuplicates(a)) { throw new IllegalArgumentException("array contains duplicate integers"); } long count = 0; for (int i = 0; i < n; i++) { int k = n - 1; for (int j = i + 1; j < n; j++) { while (k >= 0 && a[k] > -(a[i] + a[j])) { k--; } if(k < 0) { break; } if (k > j && a[i] + a[j] == -a[k]) { count++; } } } return count; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); long[] a = new long[n]; for (int i = 0; i < n; i++) { a[i] = sc.nextInt(); } sc.close(); System.out.println(count(a)); } } ``` ## [Bài tập Linked List](https://docs.google.com/document/d/1uDeCCEFVt2tHRsqInU5MSh-YTb-cpNRWTuKBMhbYrdE/edit) ### 1. [Print the Elements of a Linked List](https://www.hackerrank.com/challenges/print-the-elements-of-a-linked-list/problem) ```java static void printLinkedList(SinglyLinkedListNode head) { SinglyLinkedListNode cur = head; while (head != null) { System.out.println(head.data); head = head.next; } } ``` ### 2. [Insert a Node at the Tail of a Linked List](https://www.hackerrank.com/challenges/insert-a-node-at-the-tail-of-a-linked-list/problem) ```java static SinglyLinkedListNode insertNodeAtTail(SinglyLinkedListNode head, int data) { SinglyLinkedListNode node = new SinglyLinkedListNode(data); if (head == null) { head = node; } else { SinglyLinkedListNode temp = head; while(temp.next != null) { temp = temp.next; } temp.next = node; } return head; } ``` ### 3. [Insert a node at the head of a linked list](https://www.hackerrank.com/challenges/insert-a-node-at-the-head-of-a-linked-list/problem) ```java static SinglyLinkedListNode insertNodeAtHead(SinglyLinkedListNode llist, int data) { SinglyLinkedListNode newNode = new SinglyLinkedListNode(data); newNode.next = llist; llist = newNode; return llist; } ``` ### 4. [Insert a node at a specific position in a linked list](https://www.hackerrank.com/challenges/insert-a-node-at-a-specific-position-in-a-linked-list/problem) ```java public static SinglyLinkedListNode insertNodeAtPosition(SinglyLinkedListNode llist, int data, int position) { SinglyLinkedListNode node = new SinglyLinkedListNode(data); SinglyLinkedListNode tmp = llist; if(position == 0) { node.next = llist; llist = node; } else { for (int i = 0; i < position - 1; i++) { tmp = tmp.next; } node.next = tmp.next; tmp.next = node; } return llist; } ``` ### 5. [Delete a Node](https://www.hackerrank.com/challenges/delete-a-node-from-a-linked-list/problem) ```java public static SinglyLinkedListNode deleteNode(SinglyLinkedListNode llist, int position) { if (llist == null) return llist; if(position == 0) return llist.next; SinglyLinkedListNode tmp = llist; for (int i = 1; i < position; ++i) { tmp = tmp.next; } SinglyLinkedListNode anotherTmp = tmp.next; anotherTmp = anotherTmp.next; tmp.next = anotherTmp; return llist; } ``` ### 6. [Print in Reverse](https://www.hackerrank.com/challenges/print-the-elements-of-a-linked-list-in-reverse/problem) ```java public static void reversePrint(SinglyLinkedListNode llist) { int[] ans = new int[1000]; int id = 0; while(llist != null) { ans[id++] = llist.data; llist = llist.next; } for (int i = id - 1; i >= 0; --i) { System.out.println(ans[i]); } } ``` ### 7. [Reverse a linked list](https://www.hackerrank.com/challenges/reverse-a-linked-list/problem) ```java public static SinglyLinkedListNode reverse(SinglyLinkedListNode llist) { int[] ans = new int[1000]; if (llist == null) { return llist; } int id = 0; while(llist != null) { ans[id++] = llist.data; llist = llist.next; } SinglyLinkedListNode ret = new SinglyLinkedListNode(ans[id - 1]); SinglyLinkedListNode head = ret; for (int i = id - 2; i >= 0; --i) { ret.next = new SinglyLinkedListNode(ans[i]); ret = ret.next; } return head; } ``` ### 8. [Compare two linked lists](https://www.hackerrank.com/challenges/compare-two-linked-lists/problem) ```java static boolean compareLists(SinglyLinkedListNode head1, SinglyLinkedListNode head2) { boolean ans = true; while (head1 != null && head2 != null) { if (head1.data != head2.data) { ans = false; break; } head1 = head1.next; head2 = head2.next; } if(head1 != null || head2 != null) { ans = false; } return ans; } ``` ### 9. [Merge two sorted linked lists](hackerrank.com/challenges/merge-two-sorted-linked-lists/problem) ```java static SinglyLinkedListNode mergeLists(SinglyLinkedListNode head1, SinglyLinkedListNode head2) { SinglyLinkedList llist3 = new SinglyLinkedList(); SinglyLinkedListNode tempA = head1; SinglyLinkedListNode tempB = head2; while(tempA != null && tempB != null) { if(tempA.data < tempB.data){ llist3.insertNode(tempA.data); tempA = tempA.next; } else { llist3.insertNode(tempB.data); tempB = tempB.next; } } if(tempA != null) { while(tempA != null) { llist3.insertNode(tempA.data); tempA = tempA.next; } } if(tempB != null) { while(tempB != null) { llist3.insertNode(tempB.data); tempB = tempB.next; } } return llist3.head; } ``` ### 10. [Get Node Value](https://www.hackerrank.com/challenges/get-the-value-of-the-node-at-a-specific-position-from-the-tail/problem) ```java public static int getNode(SinglyLinkedListNode llist, int positionFromTail) { SinglyLinkedListNode tmp = llist; int sizeofList = 0; while(tmp.next != null) { tmp = tmp.next; sizeofList++; } int pos = sizeofList - positionFromTail; while (llist != null && pos != 0) { llist = llist.next; pos--; } return llist.data; } ``` ## [BT5](https://docs.google.com/document/d/1L6IC7R0TYiSZOYG2wXhCMah4WD4VSnSLdfLf1ilcvfs/edit) ### 2. [Java List](https://www.hackerrank.com/challenges/java-list/problem) ```java public class Solution { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); ArrayList<Integer> list = new ArrayList<>(); int len = scanner.nextInt(); for (int i = 0; i < len; i++) { list.add(scanner.nextInt()); } int num = scanner.nextInt(); for (int i = 0; i < num; i++) { String op = scanner.next().toLowerCase(); if (op.equals("insert")){ list.add(scanner.nextInt(), scanner.nextInt()); } if (op.equals("delete")){ list.remove(scanner.nextInt()); } } scanner.close(); for (int i = 0; i < list.size(); ++i) { System.out.print(list.get(i) + " "); } } } ``` ### 3. [Java Arraylist](https://www.hackerrank.com/challenges/java-arraylist/problem) ```java public class Solution { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); ArrayList<ArrayList<Integer>> arr = new ArrayList<ArrayList<Integer>>(); int n = scanner.nextInt(); for (int i = 0; i < n; i++) { ArrayList<Integer> line = new ArrayList<Integer>(); int d = scanner.nextInt(); for (int j = 0; j < d; j++) { line.add(scanner.nextInt()); } arr.add(line); } int q = scanner.nextInt(); for (int i = 0; i < q; i++) { try { System.out.println(arr.get(scanner.nextInt() - 1).get(scanner.nextInt() - 1)); } catch(Exception e) { System.out.println("ERROR!"); } } scanner.close(); } } ``` ### 4. [Balanced Brackets](https://www.hackerrank.com/challenges/balanced-brackets/problem) ```java class Result { public static String closingPair(String bracket) { switch (bracket) { case "}": return "{"; case "]": return "["; case ")": return "("; } return ""; } public static String isBalanced(String s) { Stack<String> stack = new Stack<String>(); for(int i = 0; i < s.length(); i++) { String chrString = Character.toString(s.charAt(i)); if(!stack.isEmpty()) { String peekedString = stack.peek(); if(peekedString.equalsIgnoreCase(closingPair(chrString))) { stack.pop(); continue; } } stack.push(chrString); } return stack.isEmpty() ? "YES" : "NO"; } } ``` ### 5. [Equal Stacks](https://www.hackerrank.com/challenges/equal-stacks/problem) ```java class Result { public static int equalStacks(List<Integer> h1, List<Integer> h2, List<Integer> h3) { int size1 = h1.size(); int size2 = h2.size(); int size3 = h3.size(); int sum1 = 0, sum2 = 0, sum3 = 0; int count1 = 0, count2 = 0, count3 = 0; for (int i = 0; i < size1; i++) { sum1 = sum1 + h1.get(i); } for (int i = 0; i < size2; i++) { sum2 = sum2 + h2.get(i); } for (int i = 0; i < size3; i++) { sum3= sum3 + h3.get(i); } if (sum1 == sum2 && sum2 == sum3) { return sum1; } while(!(sum1 == sum2 && sum2 == sum3)) { if(sum1 >= sum2 && sum1 >= sum3) { sum1 = sum1 - h1.get(count1); count1++; } else if (sum2 >= sum1 && sum2 >= sum3) { sum2 = sum2 - h2.get(count2); count2++; } else { sum3 = sum3 - h3.get(count3); count3++; } } if(size1 == 0 || size2 == 0 || size3 == 0) { return 0; } else { return sum2; } } } ``` ### 6. [Simple Text Editor](https://www.hackerrank.com/challenges/simple-text-editor/problem) ```java public class Solution { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int ops = Integer.parseInt(br.readLine()); Stack<StringBuilder> st = new Stack<>(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < ops; i++) { String z[] = br.readLine().split(" "); if(z[0].equals("1")) { st.add(new StringBuilder(sb.toString())); sb.append(z[1]); } if(z[0].equals("2")) { st.add(new StringBuilder(sb.toString())); sb.delete(sb.length() - Integer.parseInt(z[1]), sb.length()); } if(z[0].equals("3")) { System.out.println(sb.charAt(Integer.parseInt(z[1]) - 1)); } if(z[0].equals("4")) { sb = st.pop(); } } } } ``` ### 7. [Queue Using Two Stacks](https://www.hackerrank.com/challenges/queue-using-two-stacks/problem) ```java import java.util.*; public class Solution { private static class StackQueue<T> { private Stack<T> stack = new Stack<>(), auxStack = new Stack<>(); void enqueue(T elem) { stack.push(elem); } T dequeue() { if (auxStack.isEmpty()) { if (stack.isEmpty()) { System.out.println("Queue underflow"); return null; } while (!stack.isEmpty()) { auxStack.push(stack.pop()); } } return auxStack.pop(); } T peek() { if (auxStack.isEmpty()) { if (stack.isEmpty()) { System.out.println("Queue underflow"); return null; } while (!stack.isEmpty()) { auxStack.push(stack.pop()); } } return auxStack.peek(); } } public static void main(String[] args) { Scanner scan = new Scanner(System.in); int q = scan.nextInt(); scan.nextLine(); // Gets rid of the newline char List<String> queries = new ArrayList<>(q); // Query gathering for (int i = 0; i < q; i++) { queries.add(scan.nextLine()); } scan.close(); // Query handling int type, val; StackQueue<Integer> queue = new StackQueue<>(); for (String query : queries) { type = query.charAt(0); if (type == '1') { val = Integer.parseInt(query.substring(2)); queue.enqueue(val); } else if (type == '2') { queue.dequeue(); } else { System.out.println(queue.peek()); } } } } ``` ## [BT6](https://docs.google.com/document/d/1dkLn_S_Wd8qCnB_aoQHVef9Yciy1cdRXvIvRRHJuIQY/edit) ### 2. [Intro to Tutorial Challenges](https://www.hackerrank.com/challenges/tutorial-intro/problem) ```java class Result { public static int introTutorial(int V, List<Integer> arr) { // Write your code here int result = 0; int l = 0; int r = arr.size() - 1; while (l <= r) { int mid = l + (r - l) / 2; if (arr.get(mid) == V) { return mid; } if (arr.get(mid) < V) { l = mid + 1; result = mid; } else { r = mid - 1; result = mid; } } return result; } } ``` ### 3. [Insertion Sort - Part 1](https://www.hackerrank.com/challenges/insertionsort1/problem) ```java class Result { public static void print(List<Integer> arr){ for(int x: arr){ System.out.print(x+" "); } System.out.println(); } public static void insertionSort1(int n, List<Integer> arr) { int key = arr.get(arr.size() - 1); int j = arr.size() - 2; while(j >= 0 && arr.get(j) > key){ arr.set(j + 1, arr.get(j)); j--; print(arr); } arr.set(j + 1, key); print(arr); } } ``` ### 4. [Insertion Sort - Part 2](https://www.hackerrank.com/challenges/insertionsort2/problem) ```java class Result { public static void print(List<Integer> arr){ for(int x: arr){ System.out.print(x + " "); } System.out.println(); } public static void insertionSort2(int n, List<Integer> arr) { for (int i = 1; i < arr.size(); i++) { int key = arr.get(i); int j = i - 1; while(j >= 0 && arr.get(j) > key) { arr.set(j + 1, arr.get(j)); j--; } arr.set(j + 1, key); print(arr); } } } ``` ### 5. [Correctness Invariant](https://www.hackerrank.com/challenges/correctness-invariant/problem) ```java public class Solution { public static void insertionSort(int[] A){ for(int i = 1; i < A.length; i++){ int value = A[i]; int j = i - 1; while(j >= 0 && A[j] > value){ A[j + 1] = A[j]; j = j - 1; } A[j + 1] = value; } printArray(A); } static void printArray(int[] ar) { for(int n: ar){ System.out.print(n+" "); } } public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int[] ar = new int[n]; for(int i=0;i<n;i++){ ar[i]=in.nextInt(); } insertionSort(ar); } } ``` ### 6. [Counting Sort 1](https://www.hackerrank.com/challenges/countingsort1/problem) ```java class Result { public static List<Integer> countingSort(List<Integer> arr) { Integer[] answer = new Integer[100]; Arrays.fill(answer, 0); for (int v: arr) { answer[v]++; } return Arrays.asList(answer); } } ``` ### 7. > Trong hai thuật toán sắp xếp Chọn (Insertion sort) và Chèn/Xen vào (Selection Sort), dữ liệu đầu vào có nên lưu trong LinkedList (danh sách liên kết) không? Vì sao? > Trả lời: Trong hai thuật toán sắp xếp Chọn (Insertion sort) và Chèn/Xen vào (Selection Sort), dữ liệu đầu vào không nên lưu trong LinkedList (danh sách liên kết). Bởi vì việc update trong LinkedList rất phức tạp. ## [BT7](https://docs.google.com/document/d/1KndwwmFgUGY6Smj7b1L75YPX0sB2hgbWRWmqdRh5kXQ/edit) ### 2. [Computing the GCD](https://www.hackerrank.com/challenges/functional-programming-warmups-in-recursion---gcd/problem) ```java public class Solution { public static int gcd(int A,int B){ if(B == 0){ return A; } return gcd(B, A % B); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int A = sc.nextInt(); int B = sc.nextInt(); sc.close(); System.out.println(gcd(A,B)); } } ``` ### 3. [Java Sort](https://www.hackerrank.com/challenges/java-sort/problem) ```java class Student{ private int id; private String fname; private double cgpa; public Student(int id, String fname, double cgpa) { super(); this.id = id; this.fname = fname; this.cgpa = cgpa; } public int getId() { return id; } public String getFname() { return fname; } public double getCgpa() { return cgpa; } } //Complete the code public class Solution { public static void main(String[] args){ Scanner in = new Scanner(System.in); int testCases = Integer.parseInt(in.nextLine()); List<Student> studentList = new ArrayList<Student>(); while(testCases>0){ int id = in.nextInt(); String fname = in.next(); double cgpa = in.nextDouble(); Student st = new Student(id, fname, cgpa); studentList.add(st); testCases--; } in.close(); Comparator<Student> compare = (Student s1, Student s2)->{ if (s1.getCgpa() == s2.getCgpa()) { return s1.getFname().compareTo(s2.getFname()); } else { if(s1.getCgpa() - s2.getCgpa() < 0) { return 1; } else { return -1; } } }; Collections.sort(studentList, compare); for(Student st: studentList){ System.out.println(st.getFname()); } } } ``` ### 4. [Quicksort 1 - Partition](https://www.hackerrank.com/challenges/quicksort1/problem) ```java class Result { public static List<Integer> quickSort(List<Integer> arr) { int pivot = arr.get(0); int low = 0; int high = arr.size() - 1; while (low <= high) { while (low < arr.size() && arr.get(low) <= pivot) { ++low; } while (high >= 0 && arr.get(high) > pivot) { --high; } if (low <= high) { int tmp = arr.get(low); arr.set(low, arr.get(high)); arr.set(high, tmp); } } arr.set(0, arr.get(high)); arr.set(high, pivot); return arr; } } ``` ### 5. [Quicksort In-Place](https://www.hackerrank.com/challenges/quicksort3/problem) ```java import java.io.*; import java.util.*; public class Solution { private static final Scanner scanner = new Scanner(System.in); public static void main(String[] args) { int n = scanner.nextInt(); scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?"); int[] arr = new int[n]; String[] arrItems = scanner.nextLine().split(" "); scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?"); for (int i = 0; i < n; i++) { int arrItem = Integer.parseInt(arrItems[i]); arr[i] = arrItem; } quickSort(arr, 0, arr.length-1); scanner.close(); } static void quickSort(int[] arr, int low, int high) { if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi-1); quickSort(arr, pi+1, high); } } static int partition(int[] arr, int low, int high) { int pivot = arr[high]; int j = low; for (int i = low; i < high; i++) { if (arr[i] < pivot) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; j++; } } int temp = arr[j]; arr[j] = arr[high]; arr[high] = temp; for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(); return j; } } ``` ### 6. [Find the Median](https://www.hackerrank.com/challenges/find-the-median/problem) ```java class Result { public static int findMedian(List<Integer> arr) { int index; int median = 0; Collections.sort(arr); index = (arr.size() - 1) / 2; median = arr.get(index); return median; } } ``` ## [BT8](https://docs.google.com/document/d/1UVgzgppsNKqBvgIuoZ0rryy9a7vwi8CnH_8osfYnDVk/edit) ### 2. [Java String Reverse](https://www.hackerrank.com/challenges/java-string-reverse/problem) ```java public class Solution { public static void main(String[] args) { String rev = ""; Scanner sc = new Scanner(System.in); String A = sc.next(); int length = A.length(); for (int i = length - 1; i >= 0; i--) rev = rev + A.charAt(i); if (A.equals(rev)) System.out.println("Yes"); else System.out.println("No"); } } ``` ### 3. [Jesse and Cookies](https://www.hackerrank.com/challenges/jesse-and-cookies/problem) ```java class Result { public static int cookies(int k, List<Integer> A) { int count = 0; PriorityQueue<Integer> pq = new PriorityQueue<>(); for (Integer value: A) { pq.add(value); } if(pq.size() == 0 || pq.size() == 1) return -1; while (pq.size() > 1 && pq.peek() <= k) { count++; int temp = pq.poll() + (2 * pq.poll()); pq.add(temp); } if(pq.size() < 2 && pq.peek() < k) return -1; return count; } } ``` ### 4. [Java Priority Queue](https://www.hackerrank.com/challenges/java-priority-queue/problem) ```java class Priorities { public List<Student> getStudents(List<String> events) { PriorityQueue<Student> q = new PriorityQueue<>(); for (String event : events) { if (event.contains("ENTER")) { String[] student = event.split(" "); Student s = new Student( student[1], Double.parseDouble(student[2]), Integer.parseInt(student[3])); q.add(s); } if (event.contains("SERVED")) { if (q.size() > 0) { q.poll(); } } } return q.stream().sorted().collect(Collectors.toList()); } } class Student implements Comparable<Student>{ private String name; private double cgpa; private int id; public Student(){} public Student(String name, double cgpa, int id) { this.id = id; this.name = name; this.cgpa = cgpa; } public int getId() { return this.id; } public String getName() { return this.name; } public double getCGPA() { return this.cgpa; } @Override public int compareTo(Student o) { if(this.cgpa == o.cgpa) { if(this.name.equals(o.name)) { return this.id - o.id; }else { return this.name.compareTo(o.name); } }else { return this.cgpa < o.cgpa ? 1 : -1; } } } public class Solution { private final static Scanner scan = new Scanner(System.in); private final static Priorities priorities = new Priorities(); public static void main(String[] args) { int totalEvents = Integer.parseInt(scan.nextLine()); List<String> events = new ArrayList<>(); while (totalEvents-- != 0) { String event = scan.nextLine(); events.add(event); } List<Student> students = priorities.getStudents(events); if (students.isEmpty()) { System.out.println("EMPTY"); } else { for (Student st: students) { System.out.println(st.getName()); } } } } ``` ### 5. [Counting Sort 2](https://www.hackerrank.com/challenges/countingsort2/problem) ```java class Result { public static List<Integer> countingSort(List<Integer> arr) { int n = arr.size(); int max = arr.get(0); for (int i = 1; i < n; i++) if(max < arr.get(i)) max = arr.get(i); List<Integer> countSort = new ArrayList<Integer>(); List<Integer> countingSort = Arrays.asList(new Integer[n]); for (int i = 0; i <= max; i++) countSort.add(0); for (int i = 0; i < n; i++) countSort.set(arr.get(i), countSort.get(arr.get(i)) + 1); for (int i = 1; i < countSort.size(); i++) countSort.set(i, countSort.get(i - 1) + countSort.get(i)); for (int i = n - 1; i >= 0; i--) { countingSort.set(countSort.get(arr.get(i)) - 1, arr.get(i)); countSort.set(arr.get(i), countSort.get(arr.get(i)) - 1); } return countingSort; } } ``` ### 6. [Find the Running Median](https://www.hackerrank.com/challenges/find-the-running-median/problem) ```java class Result { public static List<Double> runningMedian(List<Integer> a) { int n = a.size(); Queue<Integer> max = new PriorityQueue<>(n / 2 + 1, Collections.reverseOrder()); Queue<Integer> min = new PriorityQueue<>(n / 2 + 1); List<Double> ans = new ArrayList<>(); for (int i = 1; i <= n; i++) { int x = a.get(i - 1); if (!min.isEmpty() && x > min.peek()) { min.add(x); } else { max.add(x); } while (max.size() - min.size() > 1) { int k = max.poll(); min.add(k); } while (min.size() - max.size() >= 1) { int k = min.poll(); max.add(k); } if (i % 2 == 0) { ans.add((double) (max.peek() + min.peek()) / 2); } else { ans.add((double) max.peek()); } } return ans; } } ``` ## [BT9](https://docs.google.com/document/d/1Hbt-7VW7wEVPQVrkawt9fvdcciIyIFTot7dfV19sIP4/edit) ### 2. [Java Map](https://www.hackerrank.com/challenges/phone-book/problem) ```java class Solution { public static void main(String []args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); in.nextLine(); Map<String, Integer> map = new HashMap<>(); for (int i=0;i<n;i++) { String name = in.nextLine(); int phone = in.nextInt(); map.put(name, phone); in.nextLine(); } while (in.hasNext()) { String s=in.nextLine(); if (map.containsKey(s)) { System.out.println(s + "=" + map.get(s)); } else { System.out.println("Not found"); } } } } ``` ### 3. [Java HashSet](https://www.hackerrank.com/challenges/java-hashset/problem) ```java HashSet<String> hashSet = new HashSet<>(); for (int i = 0; i < t; i++) { hashSet.add(pair_left[i] + " " + pair_right[i]); System.out.println(hashSet.size()); } ``` ### 4. [Tree: Inorder Traversal](https://www.hackerrank.com/challenges/tree-inorder-traversal/problem) ```java public static void inOrder(Node root) { if (root.left != null) { inOrder(root.left); } System.out.print(root.data + " "); if (root.right != null) { inOrder(root.right); } } ``` ### 5. [Tree: Preorder Traversal](https://www.hackerrank.com/challenges/tree-preorder-traversal/problem) ```java public static void preOrder(Node root) { System.out.print(root.data + " "); if (root.left != null) { preOrder(root.left); } if (root.right != null) { preOrder(root.right); } } ``` ### 6. [Tree: Level Order Traversal](https://www.hackerrank.com/challenges/tree-level-order-traversal/problem) ```java public static void levelOrder(Node root) { Queue<Node> pq = new LinkedList<>(); pq.add(root); while (!pq.isEmpty()) { Node p = pq.poll(); System.out.print(p.data + " "); if (p.left != null) { pq.add(p.left); } if (p.right != null) { pq.add(p.right); } } } ``` ### 7. [Closest Numbers](https://www.hackerrank.com/challenges/closest-numbers/problem) ```java static List<Integer> tmp = new ArrayList<>(); private static void mergeSort(List<Integer> arr, int low, int high) { if (low >= high) { return; } int mid = low + (high - low) / 2; mergeSort(arr, low, mid); mergeSort(arr, mid + 1, high); tmp.clear(); int i = low; int j = mid + 1; while (i <= mid && j <= high) { int a = arr.get(i); int b = arr.get(j); if (a <= b) { tmp.add(a); i++; continue; } tmp.add(b); j++; } while (i <= mid) { tmp.add(arr.get(i++)); } while (j <= high) { tmp.add(arr.get(j++)); } int pos = 0; for (int k : tmp) { arr.set(pos + low, k); pos++; } } public static List<Integer> closestNumbers(List<Integer> arr) { mergeSort(arr, 0, arr.size() - 1); List<Integer> answer = new ArrayList<>(); int minn = Integer.MAX_VALUE; for (int i = 1; i < arr.size(); i++) { if (minn > arr.get(i) - arr.get(i - 1)) { minn = arr.get(i) - arr.get(i - 1); answer.removeAll(answer); answer.add(arr.get(i - 1)); answer.add(arr.get(i)); } else if (minn == arr.get(i) - arr.get(i - 1)) { answer.add(arr.get(i - 1)); answer.add(arr.get(i)); } } return answer; } ``` ## [BT10](https://docs.google.com/document/d/1xHE6AQypBX5E16t6hjAJ4yxA5WGc9apgu1bholitmgI/edit) ### 2. [Tree: Height of a Binary Tree](https://www.hackerrank.com/challenges/tree-height-of-a-binary-tree/problem) ```java public static int height(Node root) { int ans = 0; if (root.left != null) { ans = Math.max(ans, height(root.left) + 1); } if (root.right != null) { ans = Math.max(ans, height(root.right) + 1); } return ans; } ``` ### 3. [Binary Search Tree : Insertion](https://www.hackerrank.com/challenges/binary-search-tree-insertion/problem) ```java public static Node insert(Node root,int data) { if (root == null) { return new Node(data); } Node cur = root; if (data < cur.data) { cur.left = insert(cur.left, data); } else { cur.right = insert(cur.right, data); } return cur; } ``` ### 4. [Binary Search Tree : Lowest Common Ancestor](https://www.hackerrank.com/challenges/binary-search-tree-lowest-common-ancestor/problem) ```java private static List<Integer> findAncestor(Node root, int v) { List<Integer> ancestor = new ArrayList<>(); Node p = root; while (p.data != v) { ancestor.add(p.data); if(v < p.data) { p = p.left; } else { p = p.right; } } ancestor.add(v); return ancestor; } public static Node lca(Node root, int v1, int v2) { // Write your code here. List<Integer> ancestor1 = findAncestor(root, v1); List<Integer> ancestor2 = findAncestor(root, v2); int length = Math.min(ancestor1.size(), ancestor2.size()); int LCA = root.data; for (int i = length - 1; i >= 0; i--) { int a = ancestor1.get(i); int b = ancestor2.get(i); if (a == b) { LCA = a; break; } } return new Node(LCA); } ``` ### 5. [Is This a Binary Search Tree?](https://www.hackerrank.com/challenges/is-binary-search-tree/problem) ```java List<Integer> list = new ArrayList(); void inOrder(Node root) { if (root.left != null) { inOrder(root.left); } list.add(root.data); if (root.right != null) { inOrder(root.right); } } boolean checkBST(Node root) { inOrder(root); System.err.println(list); for (int i = 1; i < list.size(); i++) { if (list.get(i - 1) >= list.get(i)) { return false; } } return true; } ``` ### 6. [Self Balancing Tree](https://www.hackerrank.com/challenges/self-balancing-tree/problem) ```java private static Node leftRotation(Node root) { Node nRoot = root.right; Node tmp = root; tmp.right = nRoot.left; nRoot.left = tmp; return nRoot; } private static Node rightRotation(Node root) { Node nRoot = root.left; Node tmp = root; tmp.left = nRoot.right; nRoot.right = tmp; return nRoot; } private static int getHeight(Node root) { if (root == null) { return -1; } return root.ht; } private static int setHeight(Node root) { return Math.max(getHeight(root.left), getHeight(root.right)) + 1; } private static Node update(Node root) { if (root == null) { return root; } if (root.left != null) { root.left.ht = setHeight(root.left); } if (root.right != null) { root.right.ht = setHeight(root.right); } root.ht = setHeight(root); return root; } static Node insert(Node root,int val) { if (root == null) { root = new Node(); root.val = val; root.ht = setHeight(root); return root; } Node cur = root; if (root.val > val) { cur.left = insert(cur.left, val); } else { cur.right = insert(cur.right, val); } int balance = getHeight(cur.left) - getHeight(cur.right); if (balance < -1) { //Right if (getHeight(cur.right.left) > getHeight(cur.right.right)) { //Left cur.right = rightRotation(cur.right); update(cur.right); } cur = leftRotation(cur); } if (balance > 1) { //Left if (getHeight(cur.left.right) > getHeight(cur.left.left)) {//Right cur.left = leftRotation(cur.left); update(cur.left); } cur = rightRotation(cur); } update(cur); return cur; } ``` ## [BT11](https://docs.google.com/document/d/1j5jlpHyo9YmT8oX9WWHI3KNeeZdkogY7O6-U5Xv46lc/edit) ### 4. [Pairs](https://www.hackerrank.com/challenges/pairs/problem) ```java public static int pairs(int k, List<Integer> arr) { int ans = 0; HashMap<Integer, Integer> mp = new HashMap<Integer, Integer>(); Collections.sort(arr); mp.put(arr.get(0), 1); for (int i = 1; i < arr.size(); i++) { if (mp.get(arr.get(i) - k) != null) { ans += mp.get(arr.get(i) - k); } if (mp.get(arr.get(i)) == null) { mp.put(arr.get(i), 1); } else { mp.put(arr.get(i), mp.get(arr.get(i)) + 1); } } return ans; } ``` ### 5. [Mising Numbers](https://www.hackerrank.com/challenges/missing-numbers/problem) a. Hash Map: $O(n\cdot log)$ ```java public static List<Integer> missingNumbers(List<Integer> arr, List<Integer> brr) { HashMap<Integer, Integer> hashMap = new HashMap<>(); for (int a : arr) { if (!hashMap.containsKey(a)) { hashMap.put(a, 1); } else { hashMap.put(a, hashMap.get(a) + 1); } } List<Integer> ans = new ArrayList<>(); for(int b : brr) { if(hashMap.get(b) == null || hashMap.get(b) == 0) { ans.add(b); hashMap.put(b, -1); } else { hashMap.put(b, hashMap.get(b) - 1); } } Collections.sort(ans); return ans; } ``` b. Sorting: $O(n\cdot log)$ ```java public static List<Integer> missingNumbers(List<Integer> arr, List<Integer> brr) { // Write your code here Collections.sort(arr); Collections.sort(brr); List<Integer> ans = new ArrayList<>(); int a = 0; for (int b : brr) { if (!ans.isEmpty() && ans.get(ans.size() - 1) == b) { continue; } while(a < arr.size() && arr.get(a) < b) { a++; } if(a == arr.size() || arr.get(a) != b) { ans.add(b); continue; } a++; } return ans; } ``` c. Counting Sort: $O(n)$ ```java public static List<Integer> missingNumbers(List<Integer> arr, List<Integer> brr) { List<Integer> ans = new ArrayList<>(); int min = Collections.min(brr); for (int i = 0; i < arr.size(); i++) { arr.set(i, arr.get(i) - min); } for (int i = 0; i < brr.size(); i++) { brr.set(i, brr.get(i) - min); } int cnt[] = new int[101]; for (int a : arr) { if (a < 0 || a > 100) { continue; } cnt[a]++; } boolean[] notHave = new boolean[101]; for (int b : brr) { if (cnt[b] == 0) { notHave[b] = true; } cnt[b]--; } for (int i = 0; i < 101; i++) { if (notHave[i]) { ans.add(i + min); } } return ans; } ``` ### 6. [Find the Running Median](https://www.hackerrank.com/challenges/find-the-running-median/problem) ```java class Pair implements Comparator<Pair>, Comparable<Pair> { public int value; public int pos; public Pair(){ } public Pair(int value, int pos) { this.value = value; this.pos = pos; } @Override public int compare(Pair pair, Pair otherPair) { int a = Integer.compare(pair.value, otherPair.value); if (a == 0) { return Integer.compare(pair.pos, otherPair.pos); } return a; } @Override public int compareTo(Pair otherPair) { return compare(this, otherPair); } } class Result { public static List<Double> runningMedian(List<Integer> a) { Pair median = null; TreeSet<Pair> treeSet = new TreeSet<>(); List<Double> ans = new ArrayList<>(); for (int i = 1; i <= a.size(); i++) { int value = a.get(i - 1); Pair pair = new Pair(value, i); boolean toLeft = false; if (median == null) { median = pair; } else { toLeft = median.compareTo(pair) > 0; } treeSet.add(pair); int size = treeSet.size(); if (size % 2 == 0) { Pair cur = null; if (toLeft) { cur = treeSet.lower(median); } else { cur = median; median = treeSet.higher(median); } ans.add(1.0 * (median.value + cur.value) / 2); } else { if (toLeft) { median = treeSet.lower(median); } ans.add(1.0 * median.value); } } return ans; } } ``` ## [BT12](https://docs.google.com/document/d/1i9zGreLuArwE_oTD0GggaoBBgvT4M7PION6DgEGL9dI/edit) ### 1. [Connected Cells in a Grid](https://www.hackerrank.com/challenges/connected-cell-in-a-grid/problem) ```java class Result { private static int encode(int row, int col, int width) { return row * width + col; } private static int decodeRow(int code, int width) { return code / width; } Prim's (MST) : Special Subtree private static int decodeCol(int code, int width) { return code % width; } private static int[][] value; private static boolean[][] visit; private static Queue<Integer> q = new LinkedList<>(); private static int[] dx = new int[] {-1, 0, 0, 1, -1, -1, 1, 1}; private static int[] dy = new int[] { 0, -1, 1, 0, 1, -1, 1, -1}; private static int BFS(int start, int height, int width) { int size = height * width; q.add(start); int ans = 0; while (!q.isEmpty()) { int index = q.poll(); int row = decodeRow(index, width); int col = decodeCol(index, width); if (visit[row][col]) { continue; } ans++; visit[row][col] = true; for (int k = 0; k < dx.length; k++) { int nRow = row + dx[k]; int nCol = col + dy[k]; if (nRow < 0 || nRow >= height) { continue; } if (nCol < 0 || nCol >= width) { continue; } if (visit[nRow][nCol]) { continue; } if (value[nRow][nCol] == 0) { continue; } q.add(encode(nRow, nCol, width)); } } return ans; } public static int connectedCell(List<List<Integer>> matrix) { int height = matrix.size(); int width = matrix.get(0).size(); visit = new boolean[height][width]; value = new int[height][width]; for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { value[row][col] = matrix.get(row).get(col); } } int ans = 0; for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { if (value[row][col] == 0) { continue; } if (visit[row][col]) { continue; } int index = encode(row, col, width); ans = Math.max(ans, BFS(index, height, width)); } } return ans; } } ``` ### 2. [Breadth First Search: Shortest Reach](https://www.hackerrank.com/challenges/bfsshortreach/problem) ```java class Result { public static List<Integer> bfs(int n, int m, List<List<Integer>> edges, int s) { Integer[] f = new Integer[n]; List[] adj = new List[n]; for (int i = 0; i < n; i++) { adj[i] = new ArrayList<Integer>(); } for (List<Integer> p : edges) { int u = p.get(0) - 1; int v = p.get(1) - 1; adj[u].add(v); adj[v].add(u); } Arrays.fill(f, -1); f[s - 1] = 0; Queue<Integer> q = new LinkedList<>(); q.add(s - 1); boolean[] inqueue = new boolean[n]; while (!q.isEmpty()) { int u = q.poll(); inqueue[u] = false; for (Object object : adj[u]) { int v = (Integer) object; if (f[v] == -1 || f[v] > f[u] + 6) { f[v] = f[u] + 6; if (!inqueue[v]) { inqueue[v] = true; q.add(v); } } } } List<Integer> ans = new ArrayList<>(); for (int i = 0; i < n; i++) { if (f[i] != 0) { ans.add(f[i]); } } return ans; } } ``` ## [BT13](https://docs.google.com/document/d/1i9zGreLuArwE_oTD0GggaoBBgvT) ### 2. [Prim's (MST) : Special Subtree](https://www.hackerrank.com/challenges/primsmstsub/problem) ```java class Cost implements Comparable<Cost> { int cost; int v; public Cost() { } public Cost(int cost, int v) { this.cost = cost; this.v = v; } @Override public int compareTo(Cost c) { if (cost < c.cost) return -1; if (cost > c.cost) return 1; if (v < c.v) return -1; if (v > c.v) return 1; return 0; } } class Result { static PriorityQueue<Cost> pq = new PriorityQueue<>(); public static int prims(int n, List<List<Integer>> edges, int start) { int[] f = new int[n]; Arrays.fill(f, -1); f[start - 1] = 0; int[][] weight = new int[n][n]; for(int i = 0; i < n; i++) { Arrays.fill(weight[i], -1); } for(List<Integer> p : edges) { int u = p.get(0) - 1; int v = p.get(1) - 1; int w = p.get(2); if (weight[u][v] == -1 || weight[u][v] > w) { weight[u][v] = w; weight[v][u] = w; } } int ans = 0; pq.add(new Cost(0, start - 1)); while (!pq.isEmpty()) { Cost cur = pq.poll(); int u = cur.v; int cost = cur.cost; if (f[u] != cost) { continue; } ans += f[u]; f[u] = 0; for (int v = 0; v < n; v++) { if (weight[u][v] == -1) { continue; } if (f[v] == -1 || f[v] > weight[u][v]) { f[v] = weight[u][v]; pq.add(new Cost(f[v], v)); } } } return ans; } } ``` ### 3. [Dijkstra: Shortest Reach 2](https://www.hackerrank.com/challenges/dijkstrashortreach/problem) ```java class Cost implements Comparable<Cost> { int cost; int v; public Cost() { } public Cost(int cost, int v) { this.cost = cost; this.v = v; } @Override public int compareTo(Cost c) { return Integer.compare(cost, c.cost); } } class Result { static PriorityQueue<Cost> pq = new PriorityQueue<>(); static List<Cost>[] adj; public static List<Integer> shortestReach(int n, int s) { int[] f = new int[n]; Arrays.fill(f, -1); f[s - 1] = 0; pq.clear(); for (int i = 0; i < n; i++) { Collections.sort(adj[i]); } pq.add(new Cost(0, s - 1)); while (!pq.isEmpty()) { Cost cur = pq.poll(); int u = cur.v; int cost = cur.cost; if (f[u] != cost) { continue; } for (Cost c : adj[u]) { int v = c.v; int w = c.cost; if (f[v] == -1 || f[v] > w + f[u]) { f[v] = w + f[u]; pq.add(new Cost(f[v], v)); } } } List<Integer> ans = new ArrayList<>(); for (int i = 0; i < n; i++) { if (i + 1 != s) { ans.add(f[i]); } } return ans; } } ``` ### 4. [Kruskal (MST): Really Special Subtree](https://www.hackerrank.com/challenges/kruskalmstrsub/problem) ```java import java.util.*; class DisjointSet { int[] lab; DisjointSet(int n) { lab = new int[n + 6]; for (int i = 0; i <= n; ++i) { lab[i] = -1; } } int find(int x) { return lab[x] < 0 ? x : (lab[x] = find(lab[x])); } boolean join(int a, int b) { int x = find(a); int y = find(b); if (x == y) return false; if (lab[x] > lab[y]) { int tmp = x; x = y; y = tmp; } lab[x] += lab[y]; lab[y] = x; return true; } } public class Solution { static void sortByColumn(int arr[][], int col) { Arrays.sort(arr, new Comparator<int[]>() { @Override public int compare(final int[] entry1, final int[] entry2) { if (entry1[col] > entry2[col]) return 1; else return -1; } }); } public static void main(String args[]) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int arr[][] = new int[m][3]; for (int i = 0; i < m; i ++) { int u = sc.nextInt(); int v = sc.nextInt(); int wt = sc.nextInt(); arr[i][0] = u - 1; arr[i][1] = v - 1; arr[i][2] = wt; } sortByColumn(arr, 2); int totalWeight = 0; DisjointSet DSU = new DisjointSet(n); for (int i = 0; i < m; i++) { int u = arr[i][0]; int v = arr[i][1]; int wt = arr[i][2]; if (DSU.join(u, v)) { totalWeight += wt; } } sc.close(); System.out.println(totalWeight); } } ```