Skip to main content

Even Integer Iterator

Problem : Given an iterator of integers, can you give me back another iterator which iterates over the given iterator of integers such that the new iterator gives only even integers.

There a couple of different ways to solve this problem.

* The first option is to create a new list of integers and add only the even integers from the given iterator and then return an iterator by calling list.iterator(). This has a time complexity of O (n) but also has a space complexity of O (n) in the worst case, which is not desirable.

Here is the code for it -

public static Iterator<Integer> giveEvenIntegersIterator(Iterator<Integer> iterator)
{
List<Integer> evenIntegers = new ArrayList<Integer>();

if (iterator != null)
{
while(iterator.hasNext())
{
Integer number = iterator.next();

if (number != null && number % 2 == 0)
{
evenIntegers.add(number);
}
}
}

return evenIntegers.iterator();
}


* The second solution which is more efficient is to implement a new EvenIntegersIterator which takes in the given iterator as a parameter in the constructor and delegates the hasNext and next calls to the original iterator with logic to skip odd integers. This solution has a time complexity of O (n) in the worst case, but space complexity of O(1) as no extra memory is needed. Here is the code -

import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.List;
import java.util.ArrayList;

/**
* This iterator implementation takes in an iterator of integers.
*
* This implementation will iterate over even integers only.
*/
public class EvenNumbersIterator implements Iterator
{
private Iterator<Integer> iterator;

private boolean hasNextCalled;

private Integer next;
private boolean hasNextValue;

/**
* Constructor which takes in an Iterator of Integers.
* @param iterator - Iterator of integers.
* @throws RuntimeException - Throws runtime exception if the iterator being passed is null.
*/
public EvenNumbersIterator(Iterator<Integer> iterator)
{
if (iterator == null)
{
throw new RuntimeException("Iterator cannot be null.");
}

this.iterator = iterator;
}

/**
* This returns if the iterator has the next element.
* @return boolean
*/
public boolean hasNext()
{
boolean hasNext = false;

if (hasNextCalled)
{
hasNext = hasNextValue;
}
else
{
hasNextCalled = true;

while (hasNext = iterator.hasNext())
{
Integer number = iterator.next();

if (number != null && number % 2 == 0)
{
next = number;
break;
}
}

hasNextValue = hasNext;
}

return hasNext;
}

/**
* Returns the next element of the iterator. Throws NoSuchElementException if there is no more elements.
* @return Object
*/
public Object next()
{
Integer returnValue = null;

if (hasNextCalled)
{
hasNextCalled = false;
returnValue = next;

if (returnValue == null)
{
throw new NoSuchElementException();
}
}
else
{
while(iterator.hasNext())
{
returnValue = iterator.next();

if (returnValue != null && returnValue % 2 == 0)
{
break;
}
}

if (returnValue == null)
{
throw new NoSuchElementException();
}
}

return returnValue;
}

public void remove()
{

}
}

Comments

Popular posts from this blog

Sum of Subsets - Find how many pairs in the given array sum to a given number

Problem : Given an array of integers intArray[] and another integer sum, find how many pairs of numbers in the given array will sum up to the given sum. This problem is one of the most sought after question in interviews. There may be slight variations of this problem. There are many ways to solve this problem. The most efficient solution considering both time and space complexity is the one discussed below - /** * This will find how many pairs of numbers in the given array sum * up to the given number. * * @param array - array of integers * @param sum - The sum * @return int - number of pairs. */ public static int sumOfSubset(int[] array, int sum) {          // This has a complexity of O ( n lg n )         Arrays.sort(array);         int pairCount = 0;         int leftIndex = 0;         int rightIndex = array.length - 1;          // The portion below has a complextiy of         //  O ( n ) in the worst case.         while (array[rightIndex] >= su

Minimum Maximum Stack

Problem : Design a stack of Numbers which will give you the minimum and maximum of all the elements it contains. This problem is also known as MinStack or MaxStack problem which expects you to find only the minimum or maximum. It is restated here to capture both. A stack typically has push(), pop() and size() operations. In order to find the minimum and the maximum, we will need to iterate over the elements of the stack each time we want to find the minimum and maximum. This will result in O (n) time complexity. And typically stack does not let us iterate over the elements. Many do not know that the java.util.Stack implementation does allow it as it extends java.util.Vector. We can make it more efficient by storing the minimum and maximum as instance variables in our stack and update them when ever we push a new number on to the stack. This will result in O(1) complexity for updating the max and min when pushing new numbers on stack, but when we pop the number which is currently set a