Publish Your Article Here

Program: HackerRank stack problem - Game Of Two Stacks.

Problem Description:

Problem Reference: Game Of Two Stacks

Alexa has two stacks of non-negative integers, stack A and stack B where index 0 denotes the top of the stack. Alexa challenges Nick to play the following game:

  • In each move, Nick can remove one integer from the top of either stack A or stack B.
  • Nick keeps a running sum of the integers he removes from the two stacks.
  • Nick is disqualified from the game if, at any point, his running sum becomes greater than some integer x given at the beginning of the game.
  • Nick's final score is the total number of integers he has removed from the two stacks.

Given A, B, and x for g games, find the maximum possible score Nick can achieve (i.e., the maximum number of integers he can remove without being disqualified) during each game and print it on a new line.

Input Format

The first line contains an integer, g (the number of games). The 3 . g subsequent lines describe each game in the following format:

  • The first line contains three space-separated integers describing the respective values of n (the number of integers in stack A), m (the number of integers in stack B), and x (the number that the sum of the integers removed from the two stacks cannot exceed).
  • The second line contains n space-separated integers for Stack A.
  • The third line contains n space-separated integers for Stack B.

Output Format

For each of the g games, print an integer on a new line denoting the maximum possible score Nick can achieve without being disqualified.

Sample Input

5 4 10
4 2 4 6 1
2 1 8 5

Sample Output



The two stacks initially look like this:

The image below depicts the integers Nick should choose to remove from the stacks. We print 4 as our answer, because that is the maximum number of integers that can be removed from the two stacks without the sum exceeding x = 10.

(There can be multiple ways to remove the integers from the stack, the image shows just one of them.)

Our Approach

The key point is that the order how each element is selected does not matter, which makes things complicated. But if we consider through the final result, we should know that the problem is equals to that, to choose the maximum number of elements from each stack so that them sum is no greater than x. The finally selected elements come from either both stacks, either all from one stack. So let's start with assuption that all from stack B. Then everthing time try adding one element from A, if the total sum is greater than x, then we should reduce elements we took from B until the sum is no more than x which will form a valid way of selection. Keep trying until no more elements can be taken from A or B. We just need to keep track of the maximum number of total elements selected.

package com.java2novice.algos;

import java.util.Scanner;

public class GameOfTwoStacks {

    static int twoStacks(int x, int[] a, int[] b) {

        int a_index = 0;
        int b_index = 0;
        int count = 0;
        int sum = 0;
        // move b_index to the position where if only take elements from B, last element it can take
        while (b_index < b.length && sum + b[b_index] <= x) {
            sum += b[b_index];
        // loop exits only when b_index reaches end or sum > x; in both case b_index should decrease
        count = b_index + 1;

        while (a_index < a.length && b_index < b.length) {
            sum += a[a_index];
            if (sum > x) {
                while (b_index >= 0) {
                    sum -= b[b_index];
                    if (sum <= x) break;
                // if even no elements taken from B, but still sum greater than x, then a[a_index] should not be chosen
                // and loop terminates
                if (sum > x && b_index < 0) {
            count = Math.max(a_index + b_index + 2, count);

        return count;

    private static final Scanner scanner = new Scanner(;

    public static void main(String[] args) {

        int g = Integer.parseInt(scanner.nextLine().trim());

        for (int gItr = 0; gItr < g; gItr++) {

            String[] nmx = scanner.nextLine().split(" ");

            int n = Integer.parseInt(nmx[0].trim());
            int m = Integer.parseInt(nmx[1].trim());
            int x = Integer.parseInt(nmx[2].trim());

            int[] a = new int[n];
            String[] aItems = scanner.nextLine().split(" ");
            for (int aItr = 0; aItr < n; aItr++) {
                int aItem = Integer.parseInt(aItems[aItr].trim());
                a[aItr] = aItem;

            int[] b = new int[m];
            String[] bItems = scanner.nextLine().split(" ");
            for (int bItr = 0; bItr < m; bItr++) {
                int bItem = Integer.parseInt(bItems[bItr].trim());
                b[bItr] = bItem;

            int result = twoStacks(x, a, b);

5 4 10
4 2 4 6 1
2 1 8 5

<< Previous Program 

List Of All Interview Programs:

  1. Remove last node of the Linked List
  2. Identify middle element of a Linked List
  3. Identify given LinkedList is a palindrom or not using Stack.
  4. Remove duplicates from sorted linked list
  5. Find Nth node from the end of Linked List
  6. Identify loop/cycle in a LinkedList.
  7. Find length of a loop in a LinkedList.
  8. Detect and remove loop in a LinkedList.
  9. How to reverse Singly Linked List?
  10. Check if given Linked List is a Circular Linked List or not.
  11. Find out duplicate number between 1 to N numbers.
  12. Find out middle index where sum of both ends are equal.
  13. Write a singleton class.
  14. Write a program to create deadlock between two threads.
  15. Write a program to reverse a string using recursive algorithm.
  16. Write a program to reverse a number.
  17. Write a program to convert decimal number to binary format.
  18. Write a program to find perfect number or not.
  19. Write a program to implement ArrayList.
  20. Write a program to find maximum repeated words from a file.
  21. Wrie a program to find out duplicate characters in a string.
  22. Write a program to find top two maximum numbers in a array.
  23. Write a program to sort a map by value.
  24. Write a program to find common elements between two arrays.
  25. How to swap two numbers without using temporary variable?
  26. Write a program to print fibonacci series.
  27. Write a program to find sum of each digit in the given number using recursion.
  28. Write a program to check the given number is a prime number or not?
  29. Write a program to find the given number is Armstrong number or not?
  30. Write a program to convert binary to decimal number.
  31. Write a program to check the given number is binary number or not?
  32. Write a program for Bubble Sort in java.
  33. Write a program for Insertion Sort in java.
  34. Write a program to implement hashcode and equals.
  35. How to get distinct elements from an array by avoiding duplicate elements?
  36. Write a program to get distinct word list from the given file.
  37. Write a program to get a line with max word count from the given file.
  38. Write a program to convert string to number without using Integer.parseInt() method.
  39. Write a program to find two lines with max characters in descending order.
  40. Write a program to find the sum of the first 1000 prime numbers.
  41. Find longest substring without repeating characters.
  42. Write a program to remove duplicates from sorted array.
  43. How to sort a Stack using a temporary Stack?
  44. Write a program to print all permutations of a given string.
  45. Implement Binary Search Tree (BST)
  46. Find min and max value from Binary Search Tree (BST)
  47. Find height of a Binary Search Tree (BST)
  48. Implement Binary Search Tree (BST) Level order traversal (breadth first).
  49. Implement Binary Search Tree (BST) pre-order traversal (depth first).
  50. Implement Binary Search Tree (BST) in-order traversal (depth first).
  51. Implement Binary Search Tree (BST) post-order traversal (depth first).
  52. How to check the given Binary Tree is Binary Search Tree (BST) or not?
  53. How to delete a node from Binary Search Tree (BST)?
  54. Write a program to find common integers between two sorted arrays.
  55. Write a program to find given two trees are mirror or not.
  56. HackerRank stack problem - Find maximum element.
  57. HackerRank stack problem - Balanced Brackets.
  58. HackerRank stack problem - Equal Stacks.
  59. HackerRank stack problem - Game Of Two Stacks.
Knowledge Centre
Difference between Enumeration and Iterator
The functionality of Enumeration and the Iterator are same. You can get remove() from Iterator to remove an element, while while Enumeration does not have remove() method. Using Enumeration you can only traverse and fetch the objects, where as using Iterator we can also add and remove the objects. So Iterator can be useful if you want to manipulate the list and Enumeration is for read-only access.
Famous Quotations
Tomorrow is often the busiest day of the week.
-- Spanish Proverb

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 © 2024 by Nataraja Gootooru. All Rights Reserved.