• Status: Solved
• Priority: Medium
• Security: Public
• Views: 142

# countHi2 challenge

Hi,

I am working on below challenge.
http://codingbat.com/prob/p143900
Psedo code:
1. check the given string starts with hi and does not have x infront of it
2.if true increment by 1 and call recursive function
3. if false call recusive function again

I wrote my code as below and not passing all tests
``````public int countHi2(String str) {
if (str.length() <2){
return 0;
}
if (str.startsWith( "hi")&!str.startsWith("xhi")) {
return 1 + countHi2(str.substring(2));
}
else {
return countHi2(str.substring(1));

}

}
``````

Expected      Run
countHi2("ahixhi") → 1      2      X
countHi2("ahibhi") → 2      2      OK
countHi2("xhixhi") → 0      2      X
countHi2("hixhi") → 1      2      X
countHi2("hixhhi") → 2      2      OK
countHi2("hihihi") → 3      3      OK
countHi2("hihihix") → 3      3      OK
countHi2("xhihihix") → 2      3      X
countHi2("xxhi") → 0      1      X
countHi2("hixxhi") → 1      2      X
countHi2("hi") → 1      1      OK
countHi2("xxxx") → 0      0      OK
countHi2("h") → 0      0      OK
countHi2("x") → 0      0      OK
countHi2("") → 0      0      OK
countHi2("Hellohi") → 1      1      OK
other tests
X
Any improvements or alternate approaches?

0
gudii9
• 4
• 3
1 Solution

Commented:
Your error in logic is this line
``````if (str.startsWith( "hi")&!str.startsWith("xhi"))
``````
You will have to break this up into two conditionals. If str starts with "xhi" then skip 3 indexes.
0

Author Commented:
``````public int countHi2(String str) {
if (str.length() <2){
return 0;
}
if (str.startsWith( "hi")) {
if(!str.startsWith("xhi")){
return 1 + countHi2(str.substring(2));
}
}
else {
return countHi2(str.substring(1));

}

}
``````

something like above
I keep getting below error many times
Compile problems:

Error:      public int countHi2(String str) {
^^^^^^^^^^^^^^^^^^^^
This method must return a result of type int

Possible problem: the if-statement structure may theoretically
allow a run to reach the end of the method without calling return.
Consider adding a last line in the method return some_value;
so a value is always returned.

0

Commented:
I will try to write pseudo code for  the code you posted.

if(length of str is less than 2) return 0
if(str starts with hi and does not starts with xhi)
return 1 + whatever countHi2(str minus the first two characters) returns
else return whatever countHi2(str minus the first character) returns

In the second if statement, you and I know that that if str starts with hi then it can't start with xhi(mutually exclusive). But the compiler doesn't know that. So, the compiler thinks that the first condition(start with hi) could be true and the second condition(start with xhi) could be false. If that did happen, then your code wouldn't return anything.  That is why you get that error.
Anyway, as I posted above here, you will have to break this up into two separate conditionals. If str starts with "xhi" then skip 3 indexes.
0

Author Commented:
``````public int countHi2(String str) {
if (str.length() <2){
return 0;
}
if (str.startsWith( "hi")) {

return 1 + countHi2(str.substring(2));
}

if (str.startsWith( "xhi")) {

return countHi2(str.substring(3));
}

else {
return countHi2(str.substring(1));
}
}
/*if(length of str is less than 2) return 0
if(str starts with hi and does not starts with xhi)
return 1 + whatever countHi2(str minus the first two characters) returns
else return whatever countHi2(str minus the first character) returns */
``````

above passes all tests. any improvement or alternate approaches?
0

Commented:
My code is the same as yours. Personally, I like to format it differently.
``````public int countHi2(String str) {
if(str.length() < 2)return 0;
if(str.startsWith("xhi"))return countHi2(str.substring(3));
if(str.startsWith("hi"))return 1 + countHi2(str.substring(2));
return countHi2(str.substring(1));
}
``````
0

Author Commented:
``````if(str.startsWith("xhi"))return countHi2(str.substring(3));
if(str.startsWith("hi"))return 1 + countHi2(str.substring(2));
``````
your order as above is reverse compared to my order as below

`````` if (str.startsWith( "hi")) {

return 1 + countHi2(str.substring(2));
}

if (str.startsWith( "xhi")) {

return countHi2(str.substring(3));
}

``````

does it matter the order here or in general??
0

Commented:
does it matter the order here or in general??
In general, it probably matters. But, in this case it doesn't matter.
0
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.