JAVA EXAMPLE PROGRAMS

JAVA EXAMPLE PROGRAMS

Publish Your Article Here

Program: HackerRank stack problem - Equal Stacks.


Problem Description:

Problem Reference: Equal Stacks

You have three stacks of cylinders where each cylinder has the same diameter, but they may vary in height. You can change the height of a stack by removing and discarding its topmost cylinder any number of times.

Find the maximum possible height of the stacks such that all of the stacks are exactly the same height. This means you must remove zero or more cylinders from the top of zero or more of the three stacks until they're all the same height, then print the height. The removals must be performed in such a way as to maximize the height.

Note: An empty stack is still a stack.

Input Format

The first line contains three space-separated integers, n1, n2, and n3, describing the respective number of cylinders in stacks 1, 2, and 3. The subsequent lines describe the respective heights of each cylinder in a stack from top to bottom:

  • The second line contains n1 space-separated integers describing the cylinder heights in stack 1. The first element is the top of the stack.
  • The third line contains n2 space-separated integers describing the cylinder heights in stack 2. The first element is the top of the stack.
  • The fourth line contains n3 space-separated integers describing the cylinder heights in stack 3. The first element is the top of the stack.

Output Format

Print a single integer denoting the maximum height at which all stacks will be of equal height.

Sample Input

5 3 4
3 2 1 1 1
4 3 2
1 1 4 1

Sample Output

5

Explanation

Initially, the stacks look like this:

Observe that the three stacks are not all the same height. To make all stacks of equal height, we remove the first cylinder from stacks 1 and 2, and then remove the top two cylinders from stack 3 (shown below).

As a result, the stacks undergo the following change in height:

  1. 8 - 3 = 5
  2. 9 - 4 = 5
  3. 7 - 1 - 1 = 5

All three stacks now have height = 5. Thus, we print 5 as our answer.

Our Approach

1) Keep track of stack heights indivitually.

2) Keep track of smallest stack height.

3) Continue removing from stacks until we reach the height of the smallest stack.

4) We can adjust the height of stack only by deletion to reach the smallest. Recalculate the smallest stack height at every step.


EqualStacks
package com.java2novice.algos;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
import java.util.Stack;

public class EqualStacks {

    static int equalStacks(int[] ha1, int[] ha2, int[] ha3) {

        Stack<Integer> s1 = new Stack<Integer>(); //First stack of cylinders
        Stack<Integer> s2 = new Stack<Integer>(); //Second stack of cylinders
        Stack<Integer> s3 = new Stack<Integer>(); //Third stack of cylinders

        int h1 = 0; //Height of the first stack
        int h2 = 0; //Height of the second stack
        int h3 = 0; //Height of the third stack

        int minStack; //The stack with the smallest height

        //Initialize the stacks and their heights
        for(int i = ha1.length-1; i >= 0 ; i--){
            s1.push(ha1[i]);
            h1 += ha1[i];
        }

        for(int i = ha2.length-1; i >= 0 ; i--){
            s2.push(ha2[i]);
            h2 += ha2[i];
        }

        for(int i = ha3.length-1; i >= 0 ; i--){
            s3.push(ha3[i]);
            h3 += ha3[i];
        }

        minStack = Math.min(h1,Math.min(h2,h3)); //Initialize minStack with the minimum height

        //Heights are not all equal enter the while loop
        while(h1 != h2 || h1 != h3) {
            //Remove cylinders from stack 1 until your height is <= the smallest
            while(h1 > minStack){
                h1 -= s1.pop();
            }
            minStack = Math.min(h1,Math.min(h2,h3)); //Recalculate min

            //Remove cylinders from stack 2 until your height is <= the smallest
            while(h2 > minStack){
                h2 -= s2.pop();
            }
            minStack = Math.min(h1,Math.min(h2,h3)); //Recalculate min

            //Remove cylinders from stack 3 until your height is <= the smallest
            while(h3 > minStack){
                h3 -= s3.pop();
            }
            minStack = Math.min(h1,Math.min(h2,h3)); //Recalculate min

        }

        return minStack;
    }

    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) throws IOException {

        String[] n1N2N3 = scanner.nextLine().split(" ");
        int n1 = Integer.parseInt(n1N2N3[0].trim());
        int n2 = Integer.parseInt(n1N2N3[1].trim());
        int n3 = Integer.parseInt(n1N2N3[2].trim());

        int[] h1 = new int[n1];
        String[] h1Items = scanner.nextLine().split(" ");
        for (int h1Itr = 0; h1Itr < n1; h1Itr++) {
            int h1Item = Integer.parseInt(h1Items[h1Itr].trim());
            h1[h1Itr] = h1Item;
        }

        int[] h2 = new int[n2];
        String[] h2Items = scanner.nextLine().split(" ");
        for (int h2Itr = 0; h2Itr < n2; h2Itr++) {
            int h2Item = Integer.parseInt(h2Items[h2Itr].trim());
            h2[h2Itr] = h2Item;
        }

        int[] h3 = new int[n3];
        String[] h3Items = scanner.nextLine().split(" ");
        for (int h3Itr = 0; h3Itr < n3; h3Itr++) {
            int h3Item = Integer.parseInt(h3Items[h3Itr].trim());
            h3[h3Itr] = h3Item;
        }

        int result = equalStacks(h1, h2, h3);
        System.out.println(result);
    }
}

Output:
5 3 4
3 2 1 1 1
4 3 2
1 1 4 1

5
<< Previous Program | Next Program >>

List Of All Interview Programs:

  1. How to reverse Singly Linked List?
  2. Find out duplicate number between 1 to N numbers.
  3. Find out middle index where sum of both ends are equal.
  4. Write a singleton class.
  5. Write a program to create deadlock between two threads.
  6. Write a program to reverse a string using recursive algorithm.
  7. Write a program to reverse a number.
  8. Write a program to convert decimal number to binary format.
  9. Write a program to find perfect number or not.
  10. Write a program to implement ArrayList.
  11. Write a program to find maximum repeated words from a file.
  12. Wrie a program to find out duplicate characters in a string.
  13. Write a program to find top two maximum numbers in a array.
  14. Write a program to sort a map by value.
  15. Write a program to find common elements between two arrays.
  16. How to swap two numbers without using temporary variable?
  17. Write a program to print fibonacci series.
  18. Write a program to find sum of each digit in the given number using recursion.
  19. Write a program to check the given number is a prime number or not?
  20. Write a program to find the given number is Armstrong number or not?
  21. Write a program to convert binary to decimal number.
  22. Write a program to check the given number is binary number or not?
  23. Write a program for Bubble Sort in java.
  24. Write a program for Insertion Sort in java.
  25. Write a program to implement hashcode and equals.
  26. How to get distinct elements from an array by avoiding duplicate elements?
  27. Write a program to get distinct word list from the given file.
  28. Write a program to get a line with max word count from the given file.
  29. Write a program to convert string to number without using Integer.parseInt() method.
  30. Write a program to find two lines with max characters in descending order.
  31. Write a program to find the sum of the first 1000 prime numbers.
  32. Find longest substring without repeating characters.
  33. Write a program to remove duplicates from sorted array.
  34. How to sort a Stack using a temporary Stack?
  35. Write a program to print all permutations of a given string.
  36. Implement Binary Search Tree (BST)
  37. Find min and max value from Binary Search Tree (BST)
  38. Find height of a Binary Search Tree (BST)
  39. Implement Binary Search Tree (BST) Level order traversal (breadth first).
  40. Implement Binary Search Tree (BST) pre-order traversal (depth first).
  41. Implement Binary Search Tree (BST) in-order traversal (depth first).
  42. Implement Binary Search Tree (BST) post-order traversal (depth first).
  43. How to check the given Binary Tree is Binary Search Tree (BST) or not?
  44. How to delete a node from Binary Search Tree (BST)?
  45. Write a program to find common integers between two sorted arrays.
  46. Write a program to find given two trees are mirror or not.
  47. HackerRank stack problem - Find maximum element.
  48. HackerRank stack problem - Balanced Brackets.
  49. HackerRank stack problem - Equal Stacks.
  50. HackerRank stack problem - Game Of Two Stacks.
Java2Novice - YouTube Channel
  1. Python Tutorial for Beginners
Knowledge Centre
Domain Naming Service(DNS)
It is very difficult to remember a set of numbers (IP address) to connect to the Internet. The Domain Naming Service(DNS) is used to overcome this problem. It maps one particular IP address to a string of characters. For example, www.java2novice.com implies com is the domain name reserved for US commercial sites, java2novice is the name of the company and www is the name of the specific computer, which is java2novice's server.
Famous Quotations
It is amazing what you can accomplish if you do not care who gets the credit.
-- Harry Truman

About Author

I'm Nataraja Gootooru, programmer by profession and passionate about technologies. All examples given here are as simple as possible to help beginners. The source code is compiled and tested in my dev environment.

If you come across any mistakes or bugs, please email me to [email protected].

Most Visited Pages

Other Interesting Sites

Reference: Java™ Platform Standard Ed. 7 - API Specification | Java™ Platform Standard Ed. 8 - API Specification | Java is registered trademark of Oracle.
Privacy Policy | Copyright © 2019 by Nataraja Gootooru. All Rights Reserved.