我在一个问题中被问到要创建一个名为search的静态 递归 方法,该方法会搜索字符串中的字符,如果找到它则会打印出来的字符串' s位置,如果它没有,则返回-1
这是我的代码
public static int search(String s , char c)
{
boolean flag = true;
if (flag == false && s.length() == 0)
return -(s.length() + 1);
else
if (s.charAt(0) == c)
{
return 1;
}
else
{
flag = false;
return 1 + search(s.substring(1) , c);
}
我使用一个标志来查看它是否在经过所有字符串后找不到它,它会预先形成所有字符串的长度减去字符串'长度 - 1, 但我总是最终得到一个" StringIndexOutOfBoundsException "错误。错误位于哪里?提前致谢! :d
编辑:如果我输入字符串中存在的字符,如动物中的 n ,但是如果我输入 o 并且字符串是动物,它会给我错误。
编辑2:我通过删除标志并遍历最后一个字符中的字符串来完成工作,谢谢大家! :d
答案 0 :(得分:0)
我猜第一个索引超出界限会发生在else block s.substring(1)......
ex:s="a", c="b"
flag=true
- 如果
(flag == false && s.length() == 0)
这将失败并转到else块- in else block
if (s.charAt(0) == c)
,此处“a”==“c”无法转到else块- 在内部的else块中,你有
醇>return 1 + search(s.substring(1) , c);
这一行将查找String索引 位置1,不可用并抛出 的StringIndexOutOfBoundsException
答案 1 :(得分:0)
由于您的递归flag
始终为true
,因此您的第一个if
永远不会是true
。
如果flag
成为班级成员,那将会有所帮助。在这种情况下,您需要在每次搜索之前重置flag
。
但如果用空字符串调用搜索,它也会导致异常。所以我认为你不需要flag
。
答案 2 :(得分:0)
您的代码几乎没有小问题。
flag
始终为true,因此如果条件始终为false:
boolean flag = true;
if (flag == false && s.length() == 0) // always false, even if
// s.length() is 0
为什么需要这个flag
变量?顺便说一下,此作业flag = false;
无效。您需要更改搜索方法search(String s , char c, boolean flag)
的签名并将其作为第3个参数传递,或者可能完全删除flag
。
第二件事是你的函数将返回所有字符串的正结果,长度超过2个字符。
return 1 + search(s.substring(1) , c);
和return -(s.length() + 1);
。只有当字符串中没有其他字符时才会执行最后一个条件(假设我们没有使用flag
变量)。
if (s.length() == 0) // there are no more characters in the str
return -(s.length() + 1); // we return -1
但在这种情况下,我们已经return 1 + search(s.substring(1) , c);
,这将导致1 + -(0+1)
。对于search("a",'d')
,
1 + 1 -(0+1)
search("ab",'d')
等等。
我希望这会有所帮助。
答案 3 :(得分:0)
如果你想从字符串的末尾开始搜索,你可以这样做:
public static int search(String s , char c) {
if (s==null || s.length() == 0)
return -1;
else if (s.charAt(s.length()-1) == c)
{
return s.length();
} else {
int pos=search(s.substring(0,s.length()-1) , c);
return pos;
}
}
答案 4 :(得分:0)
错误来自return 1 + search(s.substring(1) , c);
这一行。
如果您要搜索'o',则在上一次迭代中 s = l 并且 s.substring(1)不会存在
答案 5 :(得分:0)
您必须移出方法外的flag
变量,因为每次递归调用都会将其设置为true,因此第一个if
块将永远不会被执行。 loopCount将满足您的目的,您不需要使用标志变量。
static int loopCount =0;
public static void main( String[] args )
{
System.out.println(search("animal", 'o'));
}
public static int search(String s , char c)
{
loopCount++;
if (s.length() == 0){
return -loopCount;
}
else if (s.charAt(0) == c)
{
return 1;
}
else
{
return 1 + search(s.substring(1) , c);
}
}