Anirudh Anirudh - 3 months ago 28
Java Question

Solving codingBat Post4 with one loop in Java

The question is about Solving this problem from codingBat in Java.

Problem Statement:

Given a non-empty array of ints, return a new array containing the elements from the original array that come after the last 4 in the original array. The original array will contain at least one 4. Note that it is valid in Java to create an array of length 0.

post4({2, 4, 1, 2}) → {1, 2}

post4({4, 1, 4, 2}) → {2}

post4({4, 4, 1, 2, 3}) → {1, 2, 3}

Here is my solution:

public int[] post4(int[] nums) {

int lastFour=-1;
int[] post4={};

for(int i=nums.length-1;i>=0;i--)
{
if((nums[i]==4))
{
lastFour=i; //find the index of the last 4 in the array
break;
}
}
int newLen=(nums.length-lastFour)-1;
post4=new int[newLen]; //reassign the post4 array with required length

for(int j=0;j<newLen;j++)
{
post4[j]=nums[lastFour+1]; //assign values from orig. array after last 4
lastFour++;
}

return post4;
}


But I have used 2 loops. It should be solved using at max one loop. Do not use collections or any wrappers classes.

Answer
  • Before iteration create result array, lets say with length 0.
  • Each time you find 4 create new result array with size based on index of that 4 and length of nums to store rest of elements.
  • If number is not 4 place it in result array (don't place if result arrays length is 0 because it means we didn't find any 4 yet, or it was last element of nums array).

Here is example solution

public int[] post4(int[] nums) {

    int[] result = new int[0];

    int j = 0;
    for (int i = 0; i<nums.length; i++){
       if (nums[i] == 4) {
           result = new int[nums.length - i-1];
           j=0;
       }
       else 
           if (result.length>0) result[j++] = nums[i]; 
    }

    return result;
}