Avatar of gudii9
gudii9
Flag for United States of America asked on

has12 challenge

Hi,

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

Psedo code description of approach :
1. loop though given array
2. check where is 1
3. check where is 2
4. if 2place is somewhere further down than by 1 return true
5 else return false
I wrote my code as below
public boolean has12(int[] nums) {
  int onePlace=0;
  int twoPlace=0;
  for(int i=0;i<nums.length;i++){
    if(nums[i]==1){
      onePlace=i;
      
    }
     if(nums[i]==2){
      twoPlace=i;
      
    }
  }
  return (twoPlace>onePlace);
}

Open in new window





I am passing all tests

How to improve my design, approach, code? please advise
JavaJava EEProgrammingProgramming Languages-OtherProgramming Theory

Avatar of undefined
Last Comment
ste5an

8/22/2022 - Mon
phoffric

>> return true if there is a 1 in the array with a 2 somewhere later in the array

By hand, what should the answer be for:
5 1 6 2 7 7 8 1 0 9

Does your program agree with your by hand answer?
ste5an

First of all, there is a test missing.

What does your function return, when you're having the arrays [ 2 ] or [ 0, 2 ] ?

So you need to handle that.

Also the code path is not optimal. Your test function describes an implicit termination criteria for the loop.
gudii9

ASKER
actually my code passes all tests.
public boolean has12(int[] nums) {
  int onePlace=0;
  int twoPlace=0;
  for(int i=0;i<nums.length;i++){
    if(nums[i]==1){
      onePlace=i;
      
    }
     if(nums[i]==2){
      twoPlace=i;
      
    }
  }
  return (twoPlace>onePlace);
}

Open in new window

Expected      Run            
has12([1, 3, 2]) → true      true      OK      
has12([3, 1, 2]) → true      true      OK      
has12([3, 1, 4, 5, 2]) → true      true      OK      
has12([3, 1, 4, 5, 6]) → false      false      OK      
has12([3, 1, 4, 1, 6, 2]) → true      true      OK      
has12([2, 1, 4, 1, 6, 2]) → true      true      OK      
has12([2, 1, 4, 1, 6]) → false      false      OK      
has12([3, 5, 9]) → false      false      OK      
has12([3, 5, 1]) → false      false      OK      
has12([3, 2, 1]) → false      false      OK      
has12([1, 2]) → true      true      OK      
has12([1, 1]) → false      false      OK      
has12([1]) → false      false      OK      
has12([]) → false      false      OK      
other tests
OK      
i think i am good on this unless you want to make some suggestions on improvement, corrections?
By hand, what should the answer be for:
5 1 6 2 7 7 8 1 0 9//yes

Does your program agree with your by hand answer?// let me start eclipse in debug mode and double check it
All of life is about relationships, and EE has made a viirtual community a real community. It lifts everyone's boat
William Peck
ASKER CERTIFIED SOLUTION
phoffric

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
phoffric

It is not necessarily true that the code tester is running through all the edge (corner) cases.
Only thing that counts is a description of the problem (including their example cases which we have seen sometimes helps to clarify ambiguities).
SOLUTION
ste5an

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
gudii9

ASKER
Another one is the given termination criteria.
And last but not least there is a simple restructuring possible to minimize the number of if-tests.
sure. how to achieve above?
ste5an

Well, I've crafted my test interval for a certain purpose.

Solving this is step 1. Cause it will give you the necessary hint for the other two points.
⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
gudii9

ASKER
other two points.

which points? i was not clear?
ste5an

Sure. But do you have already a solution which gives the correct result for [ 2 ] and [ 0, 2 ]?
gudii9

ASKER
>> By hand, what should the answer be for:  5 1 6 2 7 7 8 1 0 9//yes

>>  Does your program agree with your by hand answer?// let me start eclipse in debug mode and double check it
OK. Reason I gave you this case is that your program should produce a different result. Also, for this small program, it is useful to walk through the program by hand to see what result you come up with. Then walk through in the debugger. If you do that, you get three results, not all the same. Which one(s) is/are correct?



Given an array of ints, return true if there is (not like all 1's to say 5 1 6 2 7 7 8 1 0 9 false due to bolded 1 )a 1 in the array with a 2 somewhere later in the array.

has12([1, 3, 2]) → true
has12([3, 1, 2]) → true
has12([3, 1, 4, 5, 2]) → true
This is the best money I have ever spent. I cannot not tell you how many times these folks have saved my bacon. I learn so much from the contributors.
rwheeler23
phoffric

>> Given an array of ints, return true if there is (not like all 1's to say 5 1 6 2 7 7 8 1 0 9 false due to bolded 1 )a 1 in the array with a 2 somewhere later in the array.

I didn't understand your comment.

You answered true for the manual, by hand, check. I agree since there is a 1 in the array followed by a 2. (But I suppose that one could try to interpret the question as:
  • if there is more than one 1 in the array than every 1 must be followed by a 2; or
  • if there is more than one 1 in the array than at least the last 1 must be followed by a 2; or
  • other interpretations

But I agree with your "by hand" answer.
In that case, your posted program does not give True because the last 1 is not followed by a 2.
Can you post your own solution so that your new program agrees with your "by hand" result?
ste5an

Have changed your code?

public boolean has12(int[] nums) {
    for (int i = 0; i < nums.length - 1; i++) {
        if (nums[i] == 1) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[j] == 2) {
                    return true;
                }
            }
        }
    }
    return false;
}

Open in new window