gudii9
asked on
scoresClump challenge
Hi,
I am going through below challenge.
http://codingbat.com/prob/p194530
i wonder how below is false?
scoresClump([3, 4, 6]) → false
i expected above true as difference is atmost 2? please advise
I am going through below challenge.
http://codingbat.com/prob/p194530
Expected Run
scoresClump([3, 4, 5]) → true false X
scoresClump([3, 4, 6]) → false false OK
scoresClump([1, 3, 5, 5]) → true false X
scoresClump([2, 4, 5, 6]) → true false X
scoresClump([2, 4, 5, 7]) → false false OK
scoresClump([2, 4, 4, 7]) → true false X
scoresClump([3, 3, 6, 7, 9]) → false false OK
scoresClump([3, 3, 7, 7, 9]) → true false X
scoresClump([4, 5, 8]) → false false OK
other tests
X
Your progress graph for this problem
i wonder how below is false?
scoresClump([3, 4, 6]) → false
i expected above true as difference is atmost 2? please advise
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
public boolean scoresClump(int[] scores) {
boolean result=false;
for(int i=0;i<scores.length-2;i++){
if( (scores[i+2]-scores[i])==2||(scores[i+1]-scores[i])==2){
result=true;
}
else{
result=false;
}
}
return result;
}
i am failing one test. please advise on improvements, fix
Expected Run
scoresClump([3, 4, 5]) → true true OK
scoresClump([3, 4, 6]) → false false OK
scoresClump([1, 3, 5, 5]) → true true OK
scoresClump([2, 4, 5, 6]) → true true OK
scoresClump([2, 4, 5, 7]) → false false OK
scoresClump([2, 4, 4, 7]) → true false X
scoresClump([3, 3, 6, 7, 9]) → false false OK
scoresClump([3, 3, 7, 7, 9]) → true true OK
scoresClump([4, 5, 8]) → false false OK
other tests
X
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
public boolean scoresClump(int[] scores) {
for(int i=0;i<scores.length-2;i++){
if( (scores[i+2]-scores[i])==2||(scores[i+1]-scores[i])==2){
return true;
}
}
return false;
}
i think i made changes but failing one other test
xpected Run
scoresClump([3, 4, 5]) → true true OK
scoresClump([3, 4, 6]) → false false OK
scoresClump([1, 3, 5, 5]) → true true OK
scoresClump([2, 4, 5, 6]) → true true OK
scoresClump([2, 4, 5, 7]) → false true X
scoresClump([2, 4, 4, 7]) → true true OK
scoresClump([3, 3, 6, 7, 9]) → false false OK
scoresClump([3, 3, 7, 7, 9]) → true true OK
scoresClump([4, 5, 8]) → false false OK
other tests
X
please advise
boolean scoresClump(int[] scores)
scores[i]+2 int i = 0; return true; while(i<){ if(<=){} scores[i+2]
}} i++; int i = 0;return false;scores.length-2{public
That's the code - but in entirely the wrong order.
In the original problem it states, "...differ by at most 2". Another way to read this is if the difference is less than or equal to 2. So an array such as this... [1,2,2] has a difference of only 1 but it should be counted as a clump, ie. you would return true for that case.
Also, the problem says that the numbers are already sorted in increasing order, so if you think carefully about that you will realise that you only need to check the first and the last value of a group of 3. Because they are in order, the middle number of the group of 3, will ALWAYS have a difference that is equal or less than the difference between the first and last.
Translate the above 2 points into code and you should get your solution.
Also, the problem says that the numbers are already sorted in increasing order, so if you think carefully about that you will realise that you only need to check the first and the last value of a group of 3. Because they are in order, the middle number of the group of 3, will ALWAYS have a difference that is equal or less than the difference between the first and last.
Translate the above 2 points into code and you should get your solution.
Since you are looking at groups of 3, think about starting at the second element of the array and ending at the next to last element, comparing the difference of the elements before and after.
Could you explain your comment for my benefit, as I don't get it.
ASKER
you will realise that you only need to check the first and the last value of a group of 3.check what difference to be atmost 2 or 3 or 4?
ASKER
scoresClump([2, 4, 5, 7]) → false true X
As we are checking set of 3 values each time for next iteration do i need to do i=i+3??
As we are checking set of 3 values each time for next iteration do i need to do i=i+3??
You check the difference for being more than 2 because that IS WHAT THE CHALLENGE ASKS FOR
As we are checking set of 3 values each time for next iteration do i need to do i=i+3??
No, you are looking at groups of 3 but you don't know where they start and end. So for the example that you copied above, you have to examine both the 2,4,5 group and the 4,5,7 group. So no, the loop that you had originally, with the i++ is correct.
The only change required is to the if statement on line 3. Remembering the two points I made above, ie, you have to look at only the first and last numbers in the group of 3 (not the middle) and that you need to check for a difference of less than or equal to 2.
ASKER
yes i think i got what you are saying
above passed all tests
value is===>false
any improvements/modifications /alternate approaches to my code?
public boolean scoresClump(int[] scores) {
for (int i = 0; i < scores.length - 2; i = i + 1) {
if ((scores[i + 2] - scores[i]) <= 2) {
// if ((scores[i + 2] - scores[i+1]) <= 2) {
// System.out.println("i is is--->" + i);
return true;
// }
}
}
return false;
}
above passed all tests
package com.solution;
public class ScoresCrump {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] ar = { 2, 4, 5, 7 };
System.out.println("value is===>" + scoresClump(ar));
}
public static boolean scoresClump(int[] scores) {
for (int i = 0; i < scores.length - 2; i = i + 1) {
if ((scores[i + 2] - scores[i]) == 2) {
//if ((scores[i + 2] - scores[i]) == 2) {
System.out.println("i is is--->" + i);
return true;
//}
}
}
return false;
}
}
value is===>false
any improvements/modifications
ASKER
i wonder why my java program not printing below line?
System.out.println("i is is--->" + i);
System.out.println("i is is--->" + i);
i wonder why my java program not printing below line?
System.out.println("i is is--->" + i);
If you are talking about Codingbat - you cant print to the console from there.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
sure. any specific preference of while than 'for' for this. I think both does same thing right?
i am not able to print in eclipse only not coding bat?
i wonder why my java program not printing below line?
System.out.println("i is is--->" + i);
If you are talking about Codingbat - you cant print to the console from there.
i am not able to print in eclipse only not coding bat?
No idea about Eclipse - I don't use it.
As to while versus for - think about it and tell us what you conclude for this case.
As to while versus for - think about it and tell us what you conclude for this case.
@krakatoa,
I'm not sure how that is shorter, you've broken the for loop out into a while loop, adding extra lines and then just removed some whitespace!?
@gudii9,
While vs For would be a matter of preference, but in this case I would prefer the for loop because that is exactly what it is made to do. The while loop is more general and can do more things, but in this case you want to loop a fixed number of times, and that is what the for loop is for.
I'm not sure how that is shorter, you've broken the for loop out into a while loop, adding extra lines and then just removed some whitespace!?
@gudii9,
While vs For would be a matter of preference, but in this case I would prefer the for loop because that is exactly what it is made to do. The while loop is more general and can do more things, but in this case you want to loop a fixed number of times, and that is what the for loop is for.
ASKER
sure.
i figured out reason as it never goes to if loop for below example so never prints that
i wonder why my java program not printing below line? System.out.println("i is is--->" + i);
i figured out reason as it never goes to if loop for below example so never prints that
package com.solution;
public class ScoresCrump {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] ar = { 2, 4, 5, 7 };
System.out.println("value is===>" + scoresClump(ar));
}
public static boolean scoresClump(int[] scores) {
for (int i = 0; i < scores.length - 2; i = i + 1) {
if ((scores[i + 2] - scores[i]) == 2) {
//if ((scores[i + 2] - scores[i]) == 2) {
System.out.println("i is is--->" + i);
return true;
//}
}
}
return false;
}
}
@mccarl
This comment's code https://www.experts-exchange.com/questions/28966010/scoresClump-challenge.html?anchorAnswerId=41775479#a41775479
unnecessarily tests 3 elements. My code doesn't. Unless I'm mistaken, that seems shorter to me, and if it isn't, it's better.
This comment's code https://www.experts-exchange.com/questions/28966010/scoresClump-challenge.html?anchorAnswerId=41775479#a41775479
unnecessarily tests 3 elements. My code doesn't. Unless I'm mistaken, that seems shorter to me, and if it isn't, it's better.
There are lines commented out in that code, so if those were removed it would essentially be the same.
My point is his original meta was to test 3 values which is unnecessary. Whether the lines are commented out or not doesn't change the Asker's degree of confusion with the nature of the challenge and on top of that it's not good practice to leave scraps of code and unhelpful formatting lying about all over the place. This is one of the Asker's weaknesses and so my comment about the code being shorter stands. Remember, this isn't about you as a programmer- it's about him!
public boolean scoresClump(int[] scores) {
for( int i=scores.length; --i>1; ){
if( scores[ i ]-scores[i-2]<=2 ){ return true; }
}
return false;
}
for( int i=scores.length; --i>1; ){
if( scores[ i ]-scores[i-2]<=2 ){ return true; }
}
return false;
}
Off topic - what telling someone they should use code tags?? Are you SERIOUS??
So seriously ozo - were you too lazy to put your code into code tags?
sure. any specific preference of while than 'for' for this. I think both does same thing right?
Do you think the people who invented Java would waste their time - and everyone else's - writing routines that did the same thing as routines they already had written??
You must have asked 100s of questions about for and while loops but you still haven't taken the comments and answers on board.
1.9999999999 does not equal 2