gudii9
asked on
isEverywhere challenge
Hi,
I am working on below challenge
http://codingbat.com/prob/p110222
Psedo code description of approach :
1. loop through array
2.check every adjacent values has given val
3. if yes return true
4. if no return false
I am not passing all tests
How to improve my design, approach, code? please advise
I am working on below challenge
http://codingbat.com/prob/p110222
Psedo code description of approach :
1. loop through array
2.check every adjacent values has given val
3. if yes return true
4. if no return false
I am not passing all tests
Expected Run
isEverywhere([1, 2, 1, 3], 1) → true true OK
isEverywhere([1, 2, 1, 3], 2) → false true X
isEverywhere([1, 2, 1, 3, 4], 1) → false true X
isEverywhere([2, 1, 2, 1], 1) → true true OK
isEverywhere([2, 1, 2, 1], 2) → true true OK
isEverywhere([2, 1, 2, 3, 1], 2) → false true X
isEverywhere([3, 1], 3) → true true OK
isEverywhere([3, 1], 2) → false false OK
isEverywhere([3], 1) → true false X
isEverywhere([], 1) → true false X
isEverywhere([1, 2, 1, 2, 3, 2, 5], 2) → true true OK
isEverywhere([1, 2, 1, 1, 1, 2], 2) → false true X
isEverywhere([2, 1, 2, 1, 1, 2], 2) → false true X
isEverywhere([2, 1, 2, 2, 2, 1, 1, 2], 2) → false true X
isEverywhere([2, 1, 2, 2, 2, 1, 2, 1], 2) → true true OK
isEverywhere([2, 1, 2, 1, 2], 2) → true true OK
other tests
X
How to improve my design, approach, code? please advise
Their tests are wrong. e.g.
ASKER
public boolean isEverywhere(int[] nums, int val) {
boolean result = false;
for (int i = 0; i <=nums.length-2;i++)
{
if ( nums[i] == val && nums[i+1] == val)
result = true;
}
return result;
}
is my code is correct? any modifications i can do to this. I am having hard time with edge cases? any tips to be 100% right on edge cases all the time?
Their tests are wrong. e.g.
How so? That array has two 1's next to each other, so it should fail.
is my code is correct?
Looks like you're checking to see if both elements equal the value. Is that what you want?
ASKER
We'll say that a value is "everywhere" in an array if for every pair of adjacent elements in the array, at least one of the pair is that value. Return true if the given value is everywhere in the array.
isEverywhere([1, 2, 1, 3], 1) → true
isEverywhere([1, 2, 1, 3], 2) → false
isEverywhere([1, 2, 1, 3, 4], 1) → false
Is that what you want?
that is what i understood from above challenge. i could be wrong?
Think carefully about when that if statement will return true and when it will return false. Will it return true if you pass it [1, 1]? How about [1, 2]?
How so? That array has two 1's next to each other, so it should fail.Ah - i think i was misinterpreting the question. I thought they meant distinct pairs with no overlaps
Amusingly the problem is much easier when you don't take the path i did ;)
ASKER
Will it return true if you pass it [1, 1]? How about [1, 2]?
i have not get this. method needs two arguments right? what is second argument?
isEverywhere([1, 1],1) is true
How about isEverywhere([1, 2], 1) is false
How about isEverywhere([1, 2], 2) also false?
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
it is again looks like edge case issue
ASKER
isEverywhere([3, 1], 3) → true
What will your if statement do in this situation?
(This is what I mean, by the way, when I suggest that you break down the problem into small pieces. This is a test you're failing; focus on understanding why.)
i stretching further in my thinking in terms of logic around this
ASKER
public boolean isEverywhere(int[] nums, int val) {
boolean result = false;
for (int i = 0; i <=nums.length-2;i++)
{
if ( nums[i] == val || nums[i+1] == val)
result = true;
}
return result;
}
above fails below when i replace || with &&
Correct for more than half the tests
Your progress graph for this problem
i am confused mainly in 2 things
1. edge cases
2. usage of || and && since some experts used && for OR description of challenge and vice versa. How to know what to use?
"Return true if, for every pair, condition X is true." is logically equivalent to "Return false if, for any pair, condition X is false." When you're designing your code, you should use whichever is easier. In this case, you tried it the first way and couldn't get it to work, so it might be time to try it the second way.
ASKER
public boolean isEverywhere(int[] nums, int val) {
boolean result = true;
for (int i = 0; i <=nums.length-2;i++)
{
if ( nums[i] != val || nums[i+1] != val)
result = false;
}
return result;
}
//"Return true if, for every pair, condition X is true." is logically
//equivalent to "Return false if, for any pair, condition X is false."
above corollary approach failing below tests
Expected Run
isEverywhere([1, 2, 1, 3], 1) → true false X
isEverywhere([1, 2, 1, 3], 2) → false false OK
isEverywhere([1, 2, 1, 3, 4], 1) → false false OK
isEverywhere([2, 1, 2, 1], 1) → true false X
isEverywhere([2, 1, 2, 1], 2) → true false X
isEverywhere([2, 1, 2, 3, 1], 2) → false false OK
isEverywhere([3, 1], 3) → true false X
isEverywhere([3, 1], 2) → false false OK
isEverywhere([3], 1) → true true OK
isEverywhere([], 1) → true true OK
isEverywhere([1, 2, 1, 2, 3, 2, 5], 2) → true false X
isEverywhere([1, 2, 1, 1, 1, 2], 2) → false false OK
isEverywhere([2, 1, 2, 1, 1, 2], 2) → false false OK
isEverywhere([2, 1, 2, 2, 2, 1, 1, 2], 2) → false false OK
isEverywhere([2, 1, 2, 2, 2, 1, 2, 1], 2) → true false X
isEverywhere([2, 1, 2, 1, 2], 2) → true false X
other tests
X
Once again, break it down. Take this test and figure out why your code is failing:
isEverywhere([3, 1], 3) → true
ASKER
public boolean isEverywhere(int[] nums, int val) {
boolean result = false;
for (int i = 0; i <=nums.length-2;i++)
{
if ( nums[i] == val || nums[i+1] == val)
result = true;
i=i+1;
}
return result;
}
//"Return true if, for every pair, condition X is true." is logically
//equivalent to "Return false if, for any pair, condition X is false."
i fixded above test by taking 100% sure approach which is if 3 is there in {3,1} then it is true 100% of the time irrespective of following pair of elements
if no target value in {3.1} we cannot say 100% as false since following pair of values may have target value so that is bad approach in this case(which happened to be my original approach)
ASKER
isEverywhere([1, 2, 1, 3], 2) → false true X
i was not clear why above is expected false.
i thought it should be true as target int 2 is present in first pair
similarly i though below should be true
isEverywhere([1, 2, 1, 3, 4], 1) → false true X
ASKER
isEverywhere([1, 2, 1, 3], 2) → false
isEverywhere([1, 2, 1, 3, 4], 1) → false
i thought above 2 also true as per below explanation of challenge
We'll say that a value is "everywhere" in an array if for every pair of adjacent elements in the array, at least one of the pair is that value. Return true if the given value is everywhere in the array.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
I got it.
corollary or back ward reverse approach works.
psuedocode description of loic is
1. iterate each element
2. check first element and second elemt as not equal to target element then return isEverywhere false 100% sure case
3. else return true case.
above pass all tests
corollary or back ward reverse approach works.
psuedocode description of loic is
1. iterate each element
2. check first element and second elemt as not equal to target element then return isEverywhere false 100% sure case
3. else return true case.
public boolean isEverywhere(int[] nums, int val) {
boolean result = true;
for (int i = 0; i <=nums.length-2;i++)
{
if ( nums[i] != val && nums[i+1] != val)
result = false;
}
return result;
}
above pass all tests