Solved

EvenOdd challenge

Posted on 2016-08-14
10
111 Views
Last Modified: 2016-08-21
Hi,

I am working on below challenge

http://codingbat.com/prob/p105771

My psuedo code of the logical approach is
1. loop throguh given array
2. find given elemt is even or odd.
3. if even group to front
4. if odd group to end
5. return array



I wrote my code as below


public int[] evenOdd(int[] nums) {
  for(int i=0;i<nums.length;i++){
    
    if(nums[i]%2==0){
      
  }
  else if(nums[i]%2==1){
    
  }
  }
  return nums;
}

Open in new window



I am not passing my tests as i just created skeleton code as i am not sure how to code this?

How to improve my design, approach, code? please advise
0
Comment
Question by:gudii9
10 Comments
 
LVL 37

Accepted Solution

by:
Gerwin Jansen, EE MVE earned 250 total points
ID: 41756457
Go through array once, odd number found -> exchange with first position in array. Increase first replace position when exchange is done.
0
 
LVL 21

Assisted Solution

by:Amitkumar Panchal
Amitkumar Panchal earned 125 total points
ID: 41758115
Agree with Gerwin.

public int[] evenOdd(int[] nums) {
  for(int i=0;i<nums.length-1;i++){
    for(int j=i+1;j<nums.length;j++){
      if(nums[i]%2==0){
        break;      
      } else {
        if(nums[j]%2==0){
          int tmp = nums[i];
          nums[i] = nums[j];
          nums[j] = tmp;
          break;
        }
      }
    }
    
  }
  return nums;
}

Open in new window

0
 
LVL 7

Author Comment

by:gudii9
ID: 41758237
Go through array once, odd number found -> exchange with first position in array. Increase first replace position when exchange is done.

what i supposed to do when i see even number?
0
DevOps Toolchain Recommendations

Read this Gartner Research Note and discover how your IT organization can automate and optimize DevOps processes using a toolchain architecture.

 
LVL 37

Expert Comment

by:Gerwin Jansen, EE MVE
ID: 41758271
Nothing, work out an example and see what happens ;) Change to even numbers to see the difference.
0
 
LVL 35

Assisted Solution

by:mccarl
mccarl earned 125 total points
ID: 41759354
Another possible solution, would be to create a new array of the same size, loop through the original array, if the number is even fill the result array from the front, but if it is odd, fill the result array from the back. It does require a bit extra memory to store an extra array plus you need 3 index variables... One for the main loop index, one to track where you are filling the result array from the front and one to track where you are filling from the back. But the advantage is that you only need to loop through the array once, whereas the other solutions loop through many times.
0
 
LVL 7

Author Comment

by:gudii9
ID: 41759583
i like above approach which is simple and passing all tests
public int[] evenOdd(int[] nums) {
		int len=nums.length;
		int[] arr=new int[len];
		int front=0;
		int back=len-1;
		  for(int i=0;i<nums.length;i++){		    
		    if(nums[i]%2==0){	
		    	arr[front]=nums[i];
		    	front++;
		    	
		  }
		  else if(nums[i]%2==1){
			  arr[back]=nums[i];
		    	back--;
		  }
		  }
		  return arr;
		}

Open in new window


Expected	Run		
evenOdd([1, 0, 1, 0, 0, 1, 1]) → [0, 0, 0, 1, 1, 1, 1]	[0, 0, 0, 1, 1, 1, 1]	OK	
evenOdd([3, 3, 2]) → [2, 3, 3]	[2, 3, 3]	OK	
evenOdd([2, 2, 2]) → [2, 2, 2]	[2, 2, 2]	OK	
evenOdd([3, 2, 2]) → [2, 2, 3]	[2, 2, 3]	OK	
evenOdd([1, 1, 0, 1, 0]) → [0, 0, 1, 1, 1]	[0, 0, 1, 1, 1]	OK	
evenOdd([1]) → [1]	[1]	OK	
evenOdd([1, 2]) → [2, 1]	[2, 1]	OK	
evenOdd([2, 1]) → [2, 1]	[2, 1]	OK	
evenOdd([]) → []	[]	OK	
other tests
OK	

Open in new window


import java.util.Arrays;

public class EvenOdd {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        int[] ar={1, 0, 1, 0, 0, 1, 1};
        System.out.println("value-->"+Arrays.toString(evenOdd(ar)));
	}
	
	public static int[] evenOdd(int[] nums) {
		int len=nums.length;
		int[] arr=new int[len];
		int front=0;
		int back=len-1;
		  for(int i=0;i<nums.length;i++){		    
		    if(nums[i]%2==0){	
		    	arr[front]=nums[i];
		    	front++;
		    	
		  }
		  else if(nums[i]%2==1){
			  arr[back]=nums[i];
		    	back--;
		  }
		  }
		  return arr;
		}

		/*Another possible solution, would be to create a new array of the same size,
		loop through the original array, if the number is even fill the result array from the
		front, but if it is odd, fill the result array from the back. It does require a bit 
		extra memory to store an extra array plus you need 3 index variables... One for the main
		loop index, one to track where you are filling the result array from the front and one to 
		track where you are filling from the back. But the advantage is that you only need to 
		loop through the array once, whereas the other solutions loop through many times.
*/
}

Open in new window


value-->[0, 0, 0, 1, 1, 1, 1]
0
 
LVL 7

Author Comment

by:gudii9
ID: 41759593
any improvements, refinement or optimization to my code?
0
 
LVL 7

Author Comment

by:gudii9
ID: 41759600
public int[] evenOdd(int[] nums) {
  for(int i=0;i<nums.length-1;i++){
    for(int j=i+1;j<nums.length;j++){
      if(nums[i]%2==0){
        break;      
      } else {
        if(nums[j]%2==0){
          int tmp = nums[i];
          nums[i] = nums[j];
          nums[j] = tmp;
          break;
        }
      }
    }
    
  }
  return nums;
}

Open in new window


above solution is not clear to me. why we are using two for loops one with counter i starting at 0other with counter j starting at 1?
and what is happening inside else loop for odd number case as below?
  int tmp = nums[i];
          nums[i] = nums[j];
          nums[j] = tmp;

Open in new window

0
 
LVL 7

Author Comment

by:gudii9
ID: 41764729
i think i got it.

for every i which is even we are breaking.\

if i is odd checking consecutive elements is even then swapping them till end.

so {1,0.1.0.0,1,1} becomes {0,0.0.1.1.1.1}
0

Featured Post

Resolve Critical IT Incidents Fast

If your data, services or processes become compromised, your organization can suffer damage in just minutes and how fast you communicate during a major IT incident is everything. Learn how to immediately identify incidents & best practices to resolve them quickly and effectively.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Displaying an arrayList in a listView using the default adapter is rarely the best solution. To get full control of your display data, and to be able to refresh it after editing, requires the use of a custom adapter.
Exception Handling is in the core of any application that is able to dignify its name. In this article, I'll guide you through the process of writing a DRY (Don't Repeat Yourself) Exception Handling mechanism, using Aspect Oriented Programming.
In this fifth video of the Xpdf series, we discuss and demonstrate the PDFdetach utility, which is able to list and, more importantly, extract attachments that are embedded in PDF files. It does this via a command line interface, making it suitable …

825 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question