我使用codingBat练习来练习递归,以自娱自乐。我在做这个练习:
给定一个字符串,递归计算小写"hi"在字符串中出现的次数,但不要计算前面有"x"的"hi"。
countHi2("ahixhi") → 1
countHi2("ahibhi") → 2
countHi2("xhixhi") → 0
我试着做这个代码,但它一直抛出界外异常:
public int countHi2(String str){
if(str.length()<2){
return 0;
}
else if(str.substring(0,3).equals("xhi")){
return countHi2(str.substring(3));
}
else if(str.substring(0,2).equals("hi")){
return 1+countHi2(str.substring(2));
}
else{
return countHi2(str.substring(1));
}
}
我更改了substring()并等于startsWith()
else if(str.startsWith("xhi")){
return countHi2(str.substring(3));
现在工作得很好,有人能指出为什么我的第一个代码不正确吗?startsWith()和equals()之间有区别吗?
首先确保字符串中至少有2个字符,然后测试前三个字符是否为xhi
。如果字符串不够长,String.substr
将抛出异常。
String.startsWith
没有这个问题,当你检查一个2个字符的字符串是否以3个字符开头时,它不会抛出异常——它只返回false
。