Link to home
Start Free TrialLog in
Avatar of gudii9
gudii9Flag for United States of America

asked on

zeroMAx challenge

Hi,

I am working on below challenge

http://codingbat.com/prob/p187050

My psuedo code of the logic is
1. loop through given array
2. find occurence of zero as long as not a last elemet
3. find the biggest odd after occurence of zero
4 replace i th element with biggest odd.
5 return array


I wrote my code as below
public int[] zeroMax(int[] nums) {
  
  int i, smallEven=0, bigOdd=0, countOdd=0, countEven=0;
        for(i=0; i<n; i++){
           // System.out.print("Enter element "+(i+1));
            nums[i]=sc.nextInt();
            if(a[i]%2 == 1){
                if(countOdd>0 && a[i]>bigOdd) bigOdd=a[i];
                else if(countOdd==0) bigOdd=a[i];
                countOdd++;
            }
            
  for(int i=0;i<nums.length-1;i++){
    if(  (nums[i]%2)==1 && i!=nums.len ) {
      nums[i]=
    }
    
  }
  return nums;
}

Open in new window



To find max odd
import java.util.Scanner;

public class ZeroMax {

    public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
        System.out.print("Enter the number of elements: ");
        int n = sc.nextInt();
        int[] a = new int[n];
        int i, smallEven=0, bigOdd=0, countOdd=0, countEven=0;
        for(i=0; i<n; i++){
            System.out.print("Enter element "+(i+1));
            a[i]=sc.nextInt();
            if(a[i]%2 == 1){
                if(countOdd>0 && a[i]>bigOdd) bigOdd=a[i];
                else if(countOdd==0) bigOdd=a[i];
                countOdd++;
            }
            else{
                if(countEven>0 && a[i]<smallEven) smallEven=a[i];
                else if(countEven==0)smallEven=a[i];
                countEven++;
            }
        }
        System.out.println("The smallest even number is " + smallEven);
        System.out.println("The largest odd number is " + bigOdd);
    }
}

Open in new window



I am failing tests

How to improve my design, approach, code? please advise
Avatar of Gerwin Jansen
Gerwin Jansen
Flag of Netherlands image

What tests are failing?
Avatar of gudii9

ASKER

none of the tests passing. i still need to refine my code
You need to work some examples by hand and refine your pseudo code first.
ASKER CERTIFIED SOLUTION
Avatar of mccarl
mccarl
Flag of Australia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of gudii9

ASKER

to find the max you need to look at each element from the one after the i-th element to the end of the array
how to find max element from remaining array?
what happens if i see one other 0? how to handle that scenario?
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of gudii9

ASKER

public int[] zeroMax(int[] nums) {
		for (int i = 0; i < nums.length; i++) {
			if (nums[i] == 0) {
				
				if (nums[i] == 0) {
					int largest=nums[i];
					for (int j = i; j < nums.length; j++) {
						
						if(nums[j]>largest){
							largest=nums[j];
							
						}
						if(largest>0){
							nums[i]=largest;
						}

					}
					
					
					
				}

			}

		}

		return nums;

	}

Open in new window

Expected      Run            
zeroMax([0, 5, 0, 3]) → [5, 5, 3, 3]      [5, 5, 3, 3]      OK      
zeroMax([0, 4, 0, 3]) → [3, 4, 3, 3]      [4, 4, 3, 3]      X      
zeroMax([0, 1, 0]) → [1, 1, 0]      [1, 1, 0]      OK      
zeroMax([0, 1, 5]) → [5, 1, 5]      [5, 1, 5]      OK      
zeroMax([0, 2, 0]) → [0, 2, 0]      [2, 2, 0]      X      
zeroMax([1]) → [1]      [1]      OK      
zeroMax([0]) → [0]      [0]      OK      
zeroMax([]) → []      []      OK      
zeroMax([7, 0, 4, 3, 0, 2]) → [7, 3, 4, 3, 0, 2]      [7, 4, 4, 3, 2, 2]      X      
zeroMax([7, 0, 4, 3, 0, 1]) → [7, 3, 4, 3, 1, 1]      [7, 4, 4, 3, 1, 1]      X      
zeroMax([7, 0, 4, 3, 0, 0]) → [7, 3, 4, 3, 0, 0]      [7, 4, 4, 3, 0, 0]      X      
zeroMax([7, 0, 1, 0, 0, 7]) → [7, 7, 1, 7, 7, 7]      [7, 7, 1, 7, 7, 7]      OK      
other tests
X
i passed all tests with one 0. How pass tests with more than one 0?
import java.util.Arrays;
import java.util.Scanner;

/*There's nothing particularly wrong with your pseudo-code it is
 *  just point 3 that needs to be expanded, ie. Now you know the 
 *  i-th element is zero, HOW do you find the biggest odd number
 *   after the i-th element.
Hint: to find the max you need to look at each element from the 
one after the i-th element to the end of the array, ie. you need 
a second loop. This will be within the first, main loop.*/
public class ZeroMax2 {

	public static void main(String[] args) {
		int[] ar = { 0, 5, 0, 3 };
		System.out.println("value is" + Arrays.toString(zeroMax(ar)));

		/*
		 * Return a version of the given array where each zero value in the
		 * array is replaced by the largest odd value to the right of the zero
		 * in the array. If there is no odd value to the right of the zero,
		 * leave the zero as a zero.
		 * 
		 * zeroMax([0, 5, 0, 3]) → [5, 5, 3, 3] zeroMax([0, 4, 0, 3]) → [3, 4,
		 * 3, 3] zeroMax([0, 1, 0]) → [1, 1, 0]
		 * 
		 * Hint: to find the max you need to look at each element from the one
		 * after the i-th element to the end of the array, ie. you need a second
		 * loop. This will be within the first, main loop.
		 */
	}

	public static int[] zeroMax(int[] nums) {
		for (int i = 0; i < nums.length; i++) {
			if (nums[i] == 0) {
				
				if (nums[i] == 0) {
					int largest=nums[i];
					for (int j = i; j < nums.length; j++) {
						
						if(nums[j]>largest){
							largest=nums[j];
							
						}
						if(largest>0){
							nums[i]=largest;
						}

					}
					
					
					
				}

			}

		}

		return nums;

	}

}

Open in new window

value is[5, 5, 3, 3]
Avatar of gudii9

ASKER

i think i have to tweak my incrementer to go to next 0 somehow like i=i+i like that
Avatar of gudii9

ASKER

oops i need to find largest odd number not lagest
Avatar of gudii9

ASKER

public int[] zeroMax(int[] nums) {
		for (int i = 0; i < nums.length; i++) {
			if (nums[i] == 0) {
				
				if (nums[i] == 0) {
					int largest=nums[i];
					for (int j = i; j < nums.length; j++) {
						
						if(nums[j]>largest&&nums[j]%2==1){
							largest=nums[j];
							
						}
						if(largest>0){
							nums[i]=largest;
						}

					}
					
					
					
				}

			}

		}

		return nums;

	}

Open in new window


above passed all tests. any improvements, modifications, optimization, refactoring of my code? please advise
You can do the challenge much more efficiently (with one loop) by working right to left, keeping track of the largest odd integer, and replacing 0's as you go.
Avatar of gudii9

ASKER

keeping track of the largest odd integer
how?
Just like you did here:
if(nums[j]>largest&&nums[j]%2==1){
     largest=nums[j];

Open in new window

Avatar of gudii9

ASKER

public int[] zeroMax(int[] nums) {
					
					for (int j = nums.length-1; j >=0; j--) {
						if(nums[j]==0){
						int largest=nums[j];
						if(nums[j-1]>largest&&nums[j]%2==1){
							largest=nums[j-1];
						}
						if(largest>0){
							nums[0]=largest;
						}
					}
				}
//i=i+i;
		return nums;

	}

Open in new window

something like above?
failing some tests?
Something like that.  But you need to establish the value for largest odd first.
Avatar of gudii9

ASKER

But you need to establish the value for largest odd first.
i thought i did as below?
int largest=nums[j];
largest has no meaning until you find an odd integer.
But you can give it a clever initial value that allows it to work as a flag and simplify your program.
Avatar of gudii9

ASKER

not sure on your approach. can you provide the your approach code?
Pseudo code:
maxodd = 0
loop backwards through the array
     if nums[i] is odd  &&  nums[i] > maxodd
          then  maxodd = nums[i]
     if nums[i] = 0
          then nums[i] = maxodd

Open in new window