Solved

hasBad challenge

Posted on 2014-12-04
16
129 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
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
 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
Comment Utility
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 31

Expert Comment

by:awking00
Comment Utility
Another way -
if (str.startsWith("bad") || str.startsWith("bad", 1)) {
 return true;
} else {
return false;
}
0
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 
LVL 31

Assisted Solution

by:awking00
awking00 earned 125 total points
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
"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
Comment Utility
str.startsWith("bad",0)
and
str.startsWith("bad")
are the same
0

Featured Post

Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

Join & Write a Comment

Suggested Solutions

How to remove superseded packages in windows w60 or w61 installation media (.wim) or online system to prevent unnecessary space. w60 means Windows Vista or Windows Server 2008. w61 means Windows 7 or Windows Server 2008 R2. There are various …
This article is meant to give a basic understanding of how to use R Sweave as a way to merge LaTeX and R code seamlessly into one presentable document.
This tutorial explains how to use the VisualVM tool for the Java platform application. This video goes into detail on the Threads, Sampler, and Profiler tabs.
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…

743 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

8 Experts available now in Live!

Get 1:1 Help Now