?
Solved

has77  challenge

Posted on 2016-08-03
9
Medium Priority
?
152 Views
Last Modified: 2016-08-08
Hi,

I am working on below challenge

http://codingbat.com/prob/p168357

Psedo code description of approach :
1. loop through given array
2. check if an(i th) element and i+1 th adjacent  are 7's or i, i+2 are 7's
3. if yes return true
4.if no return false

I wrote my code as below

public boolean has77(int[] nums) {
  boolean res=false;
  
  for(int i=0;i<nums.length-2;i++){
    
    if((nums[i]==7&&nums[i+1]==7)||(nums[i]==7&&nums[i+2]==7)){
      res=true;
      return res;
    }
  }
  return res;
}

Open in new window




I am not passing all tests
Expected      Run            
has77([1, 7, 7]) → true      false      X      
has77([1, 7, 1, 7]) → true      true      OK      
has77([1, 7, 1, 1, 7]) → false      false      OK      
has77([7, 7, 1, 1, 7]) → true      true      OK      
has77([2, 7, 2, 2, 7, 2]) → false      false      OK      
has77([2, 7, 2, 2, 7, 7]) → true      false      X      
has77([7, 2, 7, 2, 2, 7]) → true      true      OK      
has77([7, 2, 6, 2, 2, 7]) → false      false      OK      
has77([7, 7, 7]) → true      true      OK      
has77([7, 1, 7]) → true      true      OK      
has77([7, 1, 1]) → false      false      OK      
has77([1, 2]) → false      false      OK      
has77([1, 7]) → false      false      OK      
has77([7]) → false      false      OK      
other tests
X      
How to improve my design, approach, code? please advise
0
Comment
Question by:gudii9
  • 4
  • 3
  • 2
9 Comments
 
LVL 35

Expert Comment

by:Terry Woods
ID: 41742259
You're missing the case where the last two numbers are 7's because you stop the loop too early for the first test to pick up that case.

I could put an extra test in the code to detect it, but you might like to solve that much yourself?
0
 
LVL 7

Author Comment

by:gudii9
ID: 41742443
an extra test in the code to detect it

where and how? i am also trying now
0
 
LVL 7

Author Comment

by:gudii9
ID: 41742451
public boolean has77(int[] nums) {
  boolean res=false;
  
  for(int i=0;i<nums.length-1;i++){
    
    if((nums[i]==7&&nums[i+1]==7)||(nums[i]==7&&nums[i+2]==7)){
      res=true;
      return res;
    }
  }
  return res;
}

Open in new window

if i put nums.length-1 in for loop failing tests

Expected      Run            
has77([1, 7, 7]) → true      true      OK      
has77([1, 7, 1, 7]) → true      true      OK      
has77([1, 7, 1, 1, 7]) → false      false      OK      
has77([7, 7, 1, 1, 7]) → true      true      OK      
has77([2, 7, 2, 2, 7, 2]) → false      Exception:java.lang.ArrayIndexOutOfBoundsException: 6 (line number:6)      X      
has77([2, 7, 2, 2, 7, 7]) → true      true      OK      
has77([7, 2, 7, 2, 2, 7]) → true      true      OK      
has77([7, 2, 6, 2, 2, 7]) → false      false      OK      
has77([7, 7, 7]) → true      true      OK      
has77([7, 1, 7]) → true      true      OK      
has77([7, 1, 1]) → false      false      OK      
has77([1, 2]) → false      false      OK      
has77([1, 7]) → false      false      OK      
has77([7]) → false      false      OK      
other tests
OK      
Correct for more than half the tests

Your progress graph for this problem

if i say i<nums.length failing more
Expected      Run            
has77([1, 7, 7]) → true      true      OK      
has77([1, 7, 1, 7]) → true      true      OK      
has77([1, 7, 1, 1, 7]) → false      Exception:java.lang.ArrayIndexOutOfBoundsException: 5 (line number:6)      X      
has77([7, 7, 1, 1, 7]) → true      true      OK      
has77([2, 7, 2, 2, 7, 2]) → false      Exception:java.lang.ArrayIndexOutOfBoundsException: 6 (line number:6)      X      
has77([2, 7, 2, 2, 7, 7]) → true      true      OK      
has77([7, 2, 7, 2, 2, 7]) → true      true      OK      
has77([7, 2, 6, 2, 2, 7]) → false      Exception:java.lang.ArrayIndexOutOfBoundsException: 6 (line number:6)      X      
has77([7, 7, 7]) → true      true      OK      
has77([7, 1, 7]) → true      true      OK      
has77([7, 1, 1]) → false      false      OK      
has77([1, 2]) → false      false      OK      
has77([1, 7]) → false      Exception:java.lang.ArrayIndexOutOfBoundsException: 2 (line number:6)      X      
has77([7]) → false      Exception:java.lang.ArrayIndexOutOfBoundsException: 1 (line number:6)      X      
other tests
X      
Correct for more than half the tests

Your progress graph for this problem


Forget It! -- delete my code for this problem
Progress graphs:
 Your progress graph for this problem

any tips on mastering these edge cases so that i can be right 100% all the time
0
What Kind of Coding Program is Right for You?

There are many ways to learn to code these days. From coding bootcamps like Flatiron School to online courses to totally free beginner resources. The best way to learn to code depends on many factors, but the most important one is you. See what course is best for you.

 
LVL 35

Accepted Solution

by:
Terry Woods earned 1000 total points
ID: 41743384
This is how I would write it to demonstrate cover of the missing case, though it's not necessarily the most efficient way to code it:

public boolean has77(int[] nums) {
  boolean res=false;
  
  for(int i=0;i<nums.length-2;i++){
    
    if((nums[i]==7&&nums[i+1]==7)||(nums[i+1]==7&&nums[i+2]==7)||(nums[i]==7&&nums[i+2]==7)){
      res=true;
      return res;
    }
  }
  return res;
}

Open in new window


The middle test is the one I've added.
0
 
LVL 32

Assisted Solution

by:awking00
awking00 earned 1000 total points
ID: 41744749
To possibly avoid the index out of bounds problem, you might consider starting at index 2 and searching backwards.
0
 
LVL 7

Author Comment

by:gudii9
ID: 41745115
public boolean has77(int[] nums) {
		boolean res = false;

		for (int i = 0; i < nums.length - 2; i++) {

			if ((nums[i] == 7 && nums[i + 1] == 7) || (nums[i] == 7 && nums[i + 2] == 7)
					|| ((nums[i + 1]) == 7 && (nums[i + 2] == 7))) {

				res = true;
				return res;
			}
		}
		return res;
	}

Open in new window



above passed all tests. one lesson i should take to myself is analyzing failing tests in this case {1,7,7} so i have to handle i+1 and i+2 case as well as above
0
 
LVL 7

Author Comment

by:gudii9
ID: 41745116
To possibly avoid the index out of bounds problem, you might consider starting at index 2 and searching backwards.


what do you mean by searching backwards?
can you please elaborate on that?
0
 
LVL 32

Expert Comment

by:awking00
ID: 41747231
>>what do you mean by searching backwards?
 can you please elaborate on that?
<<
You wrote -
>>for(int i=0;i<nums.length-1;i++){
    if((nums[i]==7&&nums[i+1]==7)||(nums[i]==7&&nums[i+2]==7)){
      res=true;<<
which caused ([2, 7, 2, 2, 7, 2]) to fail with indexOutOfBounds exception
because i is going from 0 to 5 so when it looks for a value at i + 2 when i = 4 or i + 1 when i = 5, there is no such index for that array.
However, if you increment i from 2 to 5 and first search for index 2 == 7 and (index 2-1 == 7 or index 2-2 == 7) up to index 5 == 7 and (index 5-1 == 7 or index 5-2 == 7), you will always be evaluating a valid index
0
 
LVL 32

Expert Comment

by:awking00
ID: 41747234
Needed to add another condition - where (index - 2 == 7 and index - 1 == 7)
0

Featured Post

What Kind of Coding Program is Right for You?

There are many ways to learn to code these days. From coding bootcamps like Flatiron School to online courses to totally free beginner resources. The best way to learn to code depends on many factors, but the most important one is you. See what course is best for you.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

In real business world data are crucial and sometimes data are shared among different information systems. Hence, an agreeable file transfer protocol need to be established.
A solution for Fortify Path Manipulation.
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.

590 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