我正在Codingbat.com上进行一系列在线练习,以获得自己的乐趣。一组练习侧重于递归编程。在其中一个练习中,我编写了以下函数来返回传递字符串中char'x'的频率:
public int countX(String str) {
/*Given a string, compute recursively (no loops) the number of lowercase 'x'
chars in the string.*/
if (str.length()< 1){
return 0;
}else if (str.charAt(0) == 'x'){
return countX(str.substring(1)) + 1;
}else{
return countX(str.substring(1));
}
}
根据Codingbat网站的说法,这很好。
下一个练习是计算字符串中子串“hi”的频率。我尝试使用substring()
代替charAt()
来修改我之前的方法:
public int countHi(String str) {
/*Given a string, compute recursively (no loops) the number of times lowercase
"hi" appears in the string.*/
if (str.length()< 2){
return 0;
}else if (str.substring(0, 1).equals("hi")){
return countHi(str.substring(1)) + 1;
}else{
return countHi(str.substring(1));
}
}
然而,这总是返回0.它看起来像测试条件
}else if (str.substring(0, 1).equals("hi")){
永远不会满足,但我无法理解为什么。希望有人可以帮忙!
编辑:
Steve和JustinKSU指出,我正在返回一个单字符子串。我认为substring()
方法中的索引号引用了字符索引,好像它们存储在一个数组中(其中0表示第一个字符,1秒等)。它看起来像是一个更好的思考方式它是substring()
索引表示字符串中字符分隔符的计数,从第一个字符前面的分隔符开始(这样substring(0, 1)
封装第一个字符)。
答案 0 :(得分:3)
str.substring(0, 1)
只返回一个字符,因此它永远不会匹配“hi”,它有2个字符。你应该试试
str.substring(0, 2)
而不是
答案 1 :(得分:1)
您正在寻找
str.substring(0, 2)
答案 2 :(得分:0)
您可以避免使用subString()并消除复杂性。
for