Solved

hasBad challenge

Posted on 2014-12-04
16
134 Views
Last Modified: 2014-12-23
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
0
Comment
Question by:gudii9
  • 5
  • 5
  • 2
  • +2
16 Comments
 
LVL 7

Author Comment

by:gudii9
ID: 40481395
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
 
LVL 26

Assisted Solution

by:dpearson
dpearson earned 125 total points
ID: 40481397
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
 
LVL 7

Author Comment

by:gudii9
ID: 40481766
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
 
LVL 26

Expert Comment

by:dpearson
ID: 40482082
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
 
LVL 35

Assisted Solution

by:mccarl
mccarl earned 125 total points
ID: 40482182
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
 
LVL 7

Author Comment

by:gudii9
ID: 40482808
 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
 
LVL 84

Expert Comment

by:ozo
ID: 40482880
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
 
LVL 32

Expert Comment

by:awking00
ID: 40483206
Another way -
if (str.startsWith("bad") || str.startsWith("bad", 1)) {
 return true;
} else {
return false;
}
0
3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

 
LVL 32

Assisted Solution

by:awking00
awking00 earned 125 total points
ID: 40483224
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
 
LVL 84

Expert Comment

by:ozo
ID: 40483452
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
 
LVL 35

Expert Comment

by:mccarl
ID: 40492777
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
 
LVL 7

Author Comment

by:gudii9
ID: 40494869
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
 
LVL 7

Author Comment

by:gudii9
ID: 40494878
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
 
LVL 84

Expert Comment

by:ozo
ID: 40494904
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
 
LVL 84

Expert Comment

by:ozo
ID: 40494913
"xxbadxx".lastIndexOf("bad", 1) does not find "bad" before index 1, so it returns -1
-1 >= 0 is false
0
 
LVL 84

Accepted Solution

by:
ozo earned 125 total points
ID: 40494923
str.startsWith("bad",0)
and
str.startsWith("bad")
are the same
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Java Flight Recorder and Java Mission Control together create a complete tool chain to continuously collect low level and detailed runtime information enabling after-the-fact incident analysis. Java Flight Recorder is a profiling and event collectio…
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
This video teaches viewers about errors in exception handling.
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.

910 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

Need Help in Real-Time?

Connect with top rated Experts

21 Experts available now in Live!

Get 1:1 Help Now