hasBad challenge

Hi,

I am working on below challenge

http://codingbat.com/prob/p139075
I wrote my code as below
public boolean hasBad(String str) {

if(str.indexOf("bad",1)!=-1&&str.indexOf("bad",0)!=-1)
return true;
else
return false;
  
}

Open in new window



I am failing below tests.
Expected	Run		
hasBad("badxx") → true	false	X	    
hasBad("xbadxx") → true	true	OK	    
hasBad("xxbadxx") → false	true	X	    
hasBad("code") → false	false	OK	    
hasBad("bad") → true	false	X	    
hasBad("ba") → false	false	OK	    
hasBad("xba") → false	false	OK	    
hasBad("xbad") → true	true	OK	    
hasBad("") → false	false	OK	    
hasBad("badyy") → true	false	X	    
other tests
X	   

Open in new window


How to fix and improve my code. Thanks in advance
LVL 7
gudii9Asked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

gudii9Author Commented:
public boolean hasBad(String str) {

for(int i=0;i<=2;i++)
if(str.indexOf("bad",i)!=-1)
{
return true;
}
else
{
return false;
}
return false;
  
}

Open in new window


i changed as above still failing one test case

Expected	Run		
hasBad("badxx") → true	true	OK	    
hasBad("xbadxx") → true	true	OK	    
hasBad("xxbadxx") → false	true	X	    
hasBad("code") → false	false	OK	    
hasBad("bad") → true	true	OK	    
hasBad("ba") → false	false	OK	    
hasBad("xba") → false	false	OK	    
hasBad("xbad") → true	true	OK	    
hasBad("") → false	false	OK	    
hasBad("badyy") → true	true	OK	    
other tests
X	    

Open in new window

0
dpearsonCommented:
You're very close.

The problem is that str.indexOf(x) looks for anywhere that x appears in str.

But you want to make sure that x appears in specific positions - in this case position 0 and position 1.
So you want something more like this:

public boolean hasBad(String str) {

if(str.indexOf("bad",0) == 0 || str.indexOf("bad",1) == 1)
return true;
else
return false;
  
}

Open in new window

0
gudii9Author Commented:
public boolean hasBad(String str) {


if(str.indexOf("bad",1)==1 ||str.indexOf("bad",0)==0)
{
return true;
}
else
{
return false;
}

  
}

Open in new window

I passed all the tests now.

when we need to put {}
0
JavaScript Best Practices

Save hours in development time and avoid common mistakes by learning the best practices to use for JavaScript.

dpearsonCommented:
when we need to put {}
If you have 1 line of code after an if statement, then the {} are optional.  But only for 1 line of code.

So

if (x) {
    return true ;
}

is the same as

if (x)
   return true ;

Most people prefer to always put the { } in because these are very different:

if (x) {
    doSomething() ;
    return true ;
}

if (x)
   doSomething() ;
   return true ;    // Whoops - this is the 2nd line after 'if' so it ALWAYS gets called

so this code is actually the same as:

if (x) {
   doSomething() ;
}
return true ;

So adding the {} makes it all much clearer.

Doug
0
mccarlIT Business Systems Analyst / Software DeveloperCommented:
This is how I would first think to do it...
    public boolean hasBad(String str) {
        int i = str.indexOf("bad");
        return i == 0 || i == 1;
    }

Open in new window


And then, upon considering it further and how to make it as optimized as possible (that I can think of, at least) I would do this...
    public boolean hasBad2(String str) {
        int i = str.lastIndexOf("bad", 1);
        return i == 0 || i == 1;
    }

Open in new window



If you look at the solution on the codingbat.com website, it states that their solution is faster just because it doesn't have to search through the whole string. However, upon actually testing their assertion, using indexOf is actually faster except if the input string gets quite long. However, using lastIndexOf eliminates this issue and so it is faster than either their solution of the indexOf solution and doesn't change depending on the length of the input.
0
gudii9Author Commented:
 int i = str.lastIndexOf("bad", 1);
        return i == 0 || i == 1;

what is meaning of above 2 lines.

If lastIndexOf "bad" searching backwards after index 1 finds then return i as 1 or i as 0

I am not very clear. Please advise
0
ozoCommented:
i is lastIndexOf "bad" searching backwards from index 1
if it is true that i equals 0 or i equals 1, return true
if it is false that i equals 0 or i equals 1, return false
0
awking00Information Technology SpecialistCommented:
Another way -
if (str.startsWith("bad") || str.startsWith("bad", 1)) {
 return true;
} else {
return false;
}
0
awking00Information Technology SpecialistCommented:
Since the challenge mentions using .equals(), you could also do something like this -
if (str.substring(0,3).equals("bad") || str.substring(1,4).equals("bad")) {
return true;
} else {
return false;
}
0
ozoCommented:
what is meaning of
int i = str.lastIndexOf("bad", 1);
        return i == 0 || i == 1;
it means the same as
return str.lastIndexOf("bad", 1)==0 || str.lastIndexOf("bad", 1)==1;
//or
if( str.lastIndexOf("bad", 1)==0 || str.lastIndexOf("bad", 1)==1 ){ return true; }else{ return false; }
//or
if( str.lastIndexOf("bad", 1)==0 ){ return true; }
if( str.lastIndexOf("bad", 1)==1 ){ return true; }
return false;
0
mccarlIT Business Systems Analyst / Software DeveloperCommented:
Only just realised that my "lastIndexOf" solution can be improved further still, like this...

public boolean hasBad(String str) {
  return str.lastIndexOf("bad", 1) >= 0;
}

Open in new window

0
gudii9Author Commented:
if (str.startsWith("bad") || str.startsWith("bad", 1)) {

Open in new window


i never used startsWith function.


what is the meaning of above line esp str.startsWith("bad", 1). please advise

public boolean hasBad(String str) {
  return str.lastIndexOf("bad", 1) >= 0;
}

Open in new window


How above code pasing the below test case
hasBad("xxbadxx") → false	false	OK

Open in new window

It search for string "bad" backwards starting from index 1 right then searches at index 0 if tit finds returns true which makes sense to me.
But if string is "xxbadxx" if It search for string "bad" backwards starting from index 1 right then searches at index 0 it is not going to find "bad" so it must return false right. please advise
0
gudii9Author Commented:
if (str.startsWith("bad") || str.startsWith("bad", 1)) {

Open in new window



above can be written as below right which is more simple to my understanding
if (str.startsWith("bad",0) || str.startsWith("bad", 1)) {

Open in new window


if yes what is difference between below two and when to use which one
if (str.startsWith("bad",0) || str.startsWith("bad", 1)) {

Open in new window

and
if (str.startsWith("bad") || str.startsWith("bad", 1)) {

Open in new window

0
ozoCommented:
public boolean startsWith(String prefix,  int toffset)

Tests if the substring of this string beginning at the specified index starts with the specified prefix.
https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#startsWith%28java.lang.String,%20int%29
0
ozoCommented:
"xxbadxx".lastIndexOf("bad", 1) does not find "bad" before index 1, so it returns -1
-1 >= 0 is false
0
ozoCommented:
str.startsWith("bad",0)
and
str.startsWith("bad")
are the same
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Java

From novice to tech pro — start learning today.