Fix45 challenge

Hi,

I am working on below challenge.
http://codingbat.com/prob/p125819

My psedo code of approach is
1. iterate given arry
2. find position of 4
3. set next position to 5 by keeping orignal value in buffere
4. create other for loop from  index position where we found 4 plus two and if that value is 5 replace with buffere
5. return modified array

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

	    for (int z = 0; z < nums.length; z++)
	        if (nums[z] == 4) {
	            int buffer = nums[z + 1];
	            nums[z + 1] = 5;
	            for (int j = z + 2; j < nums.length; j++)
	                if (nums[j] == 5) 
	                	nums[j] = buffer;
	        }
	    return nums;
	

}

Open in new window


i am failing below tests. please advise
Expected      Run            
fix45([5, 4, 9, 4, 9, 5]) → [9, 4, 5, 4, 5, 9]      [5, 4, 5, 4, 5, 9]      X      
fix45([1, 4, 1, 5]) → [1, 4, 5, 1]      [1, 4, 5, 1]      OK      
fix45([1, 4, 1, 5, 5, 4, 1]) → [1, 4, 5, 1, 1, 4, 5]      [1, 4, 5, 1, 1, 4, 5]      OK      
fix45([4, 9, 4, 9, 5, 5, 4, 9, 5]) → [4, 5, 4, 5, 9, 9, 4, 5, 9]      [4, 5, 4, 5, 9, 9, 4, 5, 9]      OK      
fix45([5, 5, 4, 1, 4, 1]) → [1, 1, 4, 5, 4, 5]      [5, 5, 4, 5, 4, 5]      X      
fix45([4, 2, 2, 5]) → [4, 5, 2, 2]      [4, 5, 2, 2]      OK      
fix45([4, 2, 4, 2, 5, 5]) → [4, 5, 4, 5, 2, 2]      [4, 5, 4, 5, 2, 2]      OK      
fix45([4, 2, 4, 5, 5]) → [4, 5, 4, 5, 2]      [4, 5, 4, 5, 2]      OK      
fix45([1, 1, 1]) → [1, 1, 1]      [1, 1, 1]      OK      
fix45([4, 5]) → [4, 5]      [4, 5]      OK      
fix45([5, 4, 1]) → [1, 4, 5]      [5, 4, 5]      X      
fix45([]) → []      []      OK      
fix45([5, 4, 5, 4, 1]) → [1, 4, 5, 4, 5]      [5, 4, 5, 4, 5]      X      
fix45([4, 5, 4, 1, 5]) → [4, 5, 4, 5, 1]      [4, 5, 4, 5, 1]      OK      
fix45([3, 4, 5]) → [3, 4, 5]      [3, 4, 5]      OK      
fix45([4, 1, 5]) → [4, 5, 1]      [4, 5, 1]      OK      
fix45([5, 4, 1]) → [1, 4, 5]      [5, 4, 5]      X      
fix45([2, 4, 2, 5]) → [2, 4, 5, 2]      [2, 4, 5, 2]      OK      
other tests
LVL 7
gudii9Asked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

d-glitchCommented:
What do all the cases you are failing have in common?
0
gudii9Author Commented:
one extra 5
0
d-glitchCommented:
one extra 5
That's what's wrong with your result.

But what do the input arrays have in common?
0
Ultimate Tool Kit for Technology Solution Provider

Broken down into practical pointers and step-by-step instructions, the IT Service Excellence Tool Kit delivers expert advice for technology solution providers. Get your free copy now.

gudii9Author Commented:
same number of 4's and 5's
0
gudii9Author Commented:
also every 4 has a number after it that is not a 4
0
d-glitchCommented:
same number of 4's and 5's

also every 4 has a number after it that is not a 4
Both of those must be true for every case according to the problem definition.

What do the input arrays that you get wrong have in common that is different from the ones you get correct?   <== This is what debugging is all about.

How is this challenge harder than the fix34?  What is the difference?
As a hint:  Note that the challenge uses the words "this" and "version" twice.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
gudii9Author Commented:
they have 5 at beginning and failing

Below passes all tests

public int[] fix45(int[] nums) {
		  for (int x = 0; x < nums.length; x++) {
		    if (nums[x] == 4) {
		      for (int y = 0; y < nums.length; y++) {
		        if (nums[y] == 5) {
		          if (y > 0 && nums[y-1] != 4) {
		            int buffer = nums[x+1];
		            nums[x+1] = 5;
		            nums[y] = buffer;
		          } 
		          else if (y == 0) {
		            int buff = nums[x+1];
		            nums[x+1] = 5;
		            nums[y] = buff;
		          }
		                     
		        }
		      }
		    }
		  }
		  return nums;
		}

Open in new window


Expected      Run            
fix45([5, 4, 9, 4, 9, 5]) → [9, 4, 5, 4, 5, 9]      [9, 4, 5, 4, 5, 9]      OK      
fix45([1, 4, 1, 5]) → [1, 4, 5, 1]      [1, 4, 5, 1]      OK      
fix45([1, 4, 1, 5, 5, 4, 1]) → [1, 4, 5, 1, 1, 4, 5]      [1, 4, 5, 1, 1, 4, 5]      OK      
fix45([4, 9, 4, 9, 5, 5, 4, 9, 5]) → [4, 5, 4, 5, 9, 9, 4, 5, 9]      [4, 5, 4, 5, 9, 9, 4, 5, 9]      OK      
fix45([5, 5, 4, 1, 4, 1]) → [1, 1, 4, 5, 4, 5]      [1, 1, 4, 5, 4, 5]      OK      
fix45([4, 2, 2, 5]) → [4, 5, 2, 2]      [4, 5, 2, 2]      OK      
fix45([4, 2, 4, 2, 5, 5]) → [4, 5, 4, 5, 2, 2]      [4, 5, 4, 5, 2, 2]      OK      
fix45([4, 2, 4, 5, 5]) → [4, 5, 4, 5, 2]      [4, 5, 4, 5, 2]      OK      
fix45([1, 1, 1]) → [1, 1, 1]      [1, 1, 1]      OK      
fix45([4, 5]) → [4, 5]      [4, 5]      OK      
fix45([5, 4, 1]) → [1, 4, 5]      [1, 4, 5]      OK      
fix45([]) → []      []      OK      
fix45([5, 4, 5, 4, 1]) → [1, 4, 5, 4, 5]      [1, 4, 5, 4, 5]      OK      
fix45([4, 5, 4, 1, 5]) → [4, 5, 4, 5, 1]      [4, 5, 4, 5, 1]      OK      
fix45([3, 4, 5]) → [3, 4, 5]      [3, 4, 5]      OK      
fix45([4, 1, 5]) → [4, 5, 1]      [4, 5, 1]      OK      
fix45([5, 4, 1]) → [1, 4, 5]      [1, 4, 5]      OK      
fix45([2, 4, 2, 5]) → [2, 4, 5, 2]      [2, 4, 5, 2]      OK      
other tests

package com.solution;

import java.util.Arrays;

public class Fix45 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] ar={1,4,1,5};
		System.out.println("fix45 -->"+Arrays.toString(fix45(ar)));

	}

	
	public static int[] fix45(int[] nums) {
		  for (int x = 0; x < nums.length; x++) {
		    if (nums[x] == 4) {
		      for (int y = 0; y < nums.length; y++) {
		        if (nums[y] == 5) {
		          if (y > 0 && nums[y-1] != 4) {
		            int buffer = nums[x+1];
		            nums[x+1] = 5;
		            nums[y] = buffer;
		          } 
		          else if (y == 0) {
		            int buff = nums[x+1];
		            nums[x+1] = 5;
		            nums[y] = buff;
		          }
		                     
		        }
		      }
		    }
		  }
		  return nums;
		}
}

Open in new window


fix45 -->[1, 4, 5, 1]

any improvement/refinement/alternate approach?
0
rrzCommented:
I don't know if my solution is any better than yours.  I create a new array. I fill it with the values from the input array. I return the new array.
public int[] fix45(int[] nums) {
          int[] arr = new int[nums.length];
  	    for (int z = 0; z < nums.length; z++){
	        if (nums[z] == 4) {
	          arr[z] = 4;
	          arr[z + 1] = 5;
	        }
        }
        int mark = 0;
	      for (int j = 0; j < nums.length; j++){
	        if(arr[j] == 0){
	          for (int k = mark; k < nums.length; k++){
	           if(nums[k] != 4 && nums[k] != 5){
	               arr[j] = nums[k];
	               mark = k + 1;
	               break;
	           }
	          }
	        } 
        }
	      return arr;
}

Open in new window

0
d-glitchCommented:
How does your pseudo code compare with this:
b = 0
for  i= 0 to length
     if (nums[i] == 4) 
          buff[b] = nums[i+1]
          nums[i+1] = 5
          b ++

b = 0
for i= 0 to length	
     if (nums[i] == 5)
          if (i == 0)
               nums[i] = buff[b]
               b++
          else if (nums[i-1] != 4)
               nums[i] = buff[b]
               b++

Open in new window

0
gudii9Author Commented:
what is the purpose of

  mark = k + 1;

public int[] fix45(int[] nums) {
          int[] arr = new int[nums.length];
            for (int z = 0; z < nums.length; z++){
              if (nums[z] == 4) {
                arr[z] = 4;
                arr[z + 1] = 5;
              }
        }
        int mark = 0;
            for (int j = 0; j < nums.length; j++){
              if(arr[j] == 0){
                for (int k = mark; k < nums.length; k++){
                 if(nums[k] != 4 && nums[k] != 5){
                     arr[j] = nums[k];
                     mark = k + 1;
                     break;
                 }
                }
              }
        }
            return arr;
}

package com.solution;

import java.util.Arrays;

public class Fix46_2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] ar = { 1, 4, 1, 5 };
		System.out.println("fix45 -->" + Arrays.toString(fix45(ar)));

	}

	public static int[] fix45(int[] nums) {
		
        int[] arr = new int[nums.length];
	    for (int z = 0; z < nums.length; z++){
	        if (nums[z] == 4) {
	          arr[z] = 4;
	          arr[z + 1] = 5;
	        }
      }
      int mark = 0;
	      for (int j = 0; j < nums.length; j++){
	        if(arr[j] == 0){
	          for (int k = mark; k < nums.length; k++){
	           if(nums[k] != 4 && nums[k] != 5){
	               arr[j] = nums[k];
	               mark = k + 1;
	               break;
	           }
	          }
	        } 
      }
	      return arr;
}
}

Open in new window

0
gudii9Author Commented:
i see using mark and other for loop you are trying to fill non 4 and non 5 values from imput nums asrray to output new arr array.

I found your solution of filling new array is more straight forward?
why are  we starting second for loop from mark rather than 0?
public int[] fix45(int[] nums) {
          int[] arr = new int[nums.length];
            for (int z = 0; z < nums.length; z++){
              if (nums[z] == 4) {
                arr[z] = 4;
                arr[z + 1] = 5;
              }
        }
        int mark = 0;
            for (int j = 0; j < nums.length; j++){
              if(arr[j] == 0){
                for (int k = mark; k < nums.length; k++){
                 if(nums[k] != 4 && nums[k] != 5){
                     arr[j] = nums[k];
                     mark = k + 1;
                     break;
                 }
                }
              }
        }
            return arr;
}
0
gudii9Author Commented:
can i solve fix34 challenge with same above approach?
0
gudii9Author Commented:
i see you are using mark to increment inner for loop with k as you are breaking out of it prematurely for k++ to take place later.
0
rrzCommented:
i see you are using mark to increment inner for loop with k as you are breaking out of it prematurely for k++ to take place later.
I used the mark variable to know where to begin looking for the next number to use to fill into the arr array. The increment in the loop(k++) is still used.  
There probably is room for improvement. But, when you closed this question, I stopped working on this.  Anyway, maybe adding some debug statements, will shed some light on my code. See below,
import java.util.Arrays;
public class Fix{
	public static void main(String[] args) {
		int[] input = {2, 3, 4, 6, 4, 7, 5, 5, 4, 8, 5};
		System.out.println("  input -->" + Arrays.toString(input));
		fix45(input);
	}
	public static int[] fix45(int[] nums) {
        int[] arr = new int[nums.length];
  	    for (int z = 0; z < nums.length; z++){
	        if (nums[z] == 4) {
	          arr[z] = 4;
	          arr[z + 1] = 5;
	        }
        }
		System.out.println(" output -->" + Arrays.toString(arr) + " (after first for loop)");
        int mark = 0;
	    for (int j = 0; j < nums.length; j++){
	        if(arr[j] == 0){
	          for (int k = mark; k < nums.length; k++){
	            if(nums[k] != 4 && nums[k] != 5){
	               arr[j] = nums[k];
				   mark = k + 1;
				   System.out.println(" j is " + j + ", k is " + k + ", mark is " + mark);
				   System.out.println(" output -->" + Arrays.toString(arr));
	               break;
	            }   
	          }
	        } 
        }
	      return arr;	
}
}

Open in new window

The output is :    
  input -->[2, 3, 4, 6, 4, 7, 5, 5, 4, 8, 5]
 output -->[0, 0, 4, 5, 4, 5, 0, 0, 4, 5, 0] (after first for loop)
 j is 0, k is 0, mark is 1
 output -->[2, 0, 4, 5, 4, 5, 0, 0, 4, 5, 0]
 j is 1, k is 1, mark is 2
 output -->[2, 3, 4, 5, 4, 5, 0, 0, 4, 5, 0]
 j is 6, k is 3, mark is 4
 output -->[2, 3, 4, 5, 4, 5, 6, 0, 4, 5, 0]
 j is 7, k is 5, mark is 6
 output -->[2, 3, 4, 5, 4, 5, 6, 7, 4, 5, 0]
 j is 10, k is 9, mark is 10
 output -->[2, 3, 4, 5, 4, 5, 6, 7, 4, 5, 8]
0
gudii9Author Commented:
 input -->[2, 3, 4, 6, 4, 7, 5, 5, 4, 8, 5]
 output -->[0, 0, 4, 5, 4, 5, 0, 0, 4, 5, 0] (after first for loop)
 j is 0, k is 0, mark is 1
 output -->[2, 0, 4, 5, 4, 5, 0, 0, 4, 5, 0]
 j is 1, k is 1, mark is 2
 output -->[2, 3, 4, 5, 4, 5, 0, 0, 4, 5, 0]
 j is 6, k is 3, mark is 4
 output -->[2, 3, 4, 5, 4, 5, 6, 0, 4, 5, 0]
 j is 7, k is 5, mark is 6
 output -->[2, 3, 4, 5, 4, 5, 6, 7, 4, 5, 0]
 j is 10, k is 9, mark is 10
 output -->[2, 3, 4, 5, 4, 5, 6, 7, 4, 5, 8]

above output is more clear now. To understand again today taking some time around 1 hour even though i saw this day before yesterday?
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Java

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.