Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用递归查找';嗨';在字符串中,但不是';xhi';_Java_Recursion - Fatal编程技术网

Java 使用递归查找';嗨';在字符串中,但不是';xhi';

Java 使用递归查找';嗨';在字符串中,但不是';xhi';,java,recursion,Java,Recursion,我正在做一个来自codingbat的问题,我被困在这个问题上。问题要求我在字符串中查找所有的'hi',但忽略前面有'x'的'hi'。换句话说,不要计算'xhi',而只计算'hi' 在我的代码中,除了输入为“xxxx”时,每个输入都可以正常工作。 我的代码如下: public int countHi2(String str) { String s = "hi"; int count = 0; if(str.length() < 2) {

我正在做一个来自codingbat的问题,我被困在这个问题上。问题要求我在字符串中查找所有的
'hi'
,但忽略前面有
'x'
'hi'
。换句话说,不要计算
'xhi'
,而只计算
'hi'

在我的代码中,除了输入为
“xxxx”
时,每个输入都可以正常工作。 我的代码如下:

public int countHi2(String str) {
      String s = "hi";
      int count = 0;

      if(str.length() < 2) {
          return 0;
      }
      else if(str.charAt(0) == 'x' && str.substring(1,3).equals(s)) {
           count+= countHi2(str.substring(3));
      }
      else if(str.substring(0,2).equals(s)){
          count+= 1 + countHi2(str.substring(2));
      }
      else {
          count+= countHi2(str.substring(1));
      }
      return count;
}
public int countHi2(字符串str){
字符串s=“hi”;
整数计数=0;
如果(str.length()<2){
返回0;
}
else如果(str.charAt(0)='x'&&str.substring(1,3).等于(s)){
count+=countHi2(str.substring(3));
}
else if(str.substring(0,2).equals(s)){
count+=1+countHi2(str.substring(2));
}
否则{
count+=countHi2(str.substring(1));
}
返回计数;
}

问题是它抛出IndexOutOfBoundsException。可以找到问题的链接。

问题是,如果字符串末尾(或最后两个位置之一)有一个“x”,则子字符串将从超出范围的索引开始(如异常所示)。如果
str.substring(3)
可行,您可以在这种情况下进行检查:

else if(str.charAt(0) == 'x' && str.substring(1,3).equals(s)) {
  if (str.length() > 3) count+= countHi2(str.substring(3));
  else return count;
}

问题是,如果字符串末尾(或最后2个位置之一)有一个“x”,则子字符串将从超出范围的索引开始(如异常所示)。如果
str.substring(3)
可行,您可以在这种情况下进行检查:

else if(str.charAt(0) == 'x' && str.substring(1,3).equals(s)) {
  if (str.length() > 3) count+= countHi2(str.substring(3));
  else return count;
}

您会看到异常,因为您检查长度是否至少为2,然后执行子字符串(1,3),从而导致异常


通过切换到
startsWith
API,可以避免
IndexOutOfBoundsException
中的
indexoutboundsexception
问题,该API即使在将字符串与较长字符串进行比较时也不会引发异常。

您会看到异常,因为您检查长度至少为2,然后执行
子字符串(1,3)
,导致异常的


通过切换到
startsWith
API,可以避免
substring
中的
IndexOutOfBoundsException
问题,该API即使将字符串与较长的字符串进行比较,也不会引发异常。

您永远不会到达此行

return count;
您一直在使用if-else 当您的输入为“xxxx”时,您将继续访问

count+= countHi2(str.substring(1));

你永远也到不了这条线

return count;
您一直在使用if-else 当您的输入为“xxxx”时,您将继续访问

count+= countHi2(str.substring(1));

你可以这样做:

public static int countHi2(String str) {
    if (str.startsWith("xhi")) {
        return countHi2(str.substring(3));
    } else if (str.startsWith("hi")) {
        return countHi2(str.substring(2)) + 1;  
    } else if (str.length() > 0){
        return countHi2(str.substring(1));
    } else {
        return 0;
    }
}

(它不处理空值,实际上也没有经过优化。)

您可以执行以下操作:

public static int countHi2(String str) {
    if (str.startsWith("xhi")) {
        return countHi2(str.substring(3));
    } else if (str.startsWith("hi")) {
        return countHi2(str.substring(2)) + 1;  
    } else if (str.length() > 0){
        return countHi2(str.substring(1));
    } else {
        return 0;
    }
}

(它不处理空值,而且实际上没有经过优化。)

第8行需要修改

else if(str.length()>=3 && str.charAt(0) == 'x' && str.substring(1,3).equals(s))
{...}
总代码应为-

public int countHi2(String str) {
  String s = "hi";
      int count = 0;

      if(str.length() < 2) {
          return 0;
      }
      else if(str.length()>=3 && str.charAt(0) == 'x' && str.substring(1,3).equals(s)) {
           count+= countHi2(str.substring(3));
      }
      else if(str.substring(0,2).equals(s)){
          count+= 1 + countHi2(str.substring(2));
      }
      else {
          count+= countHi2(str.substring(1));
      }
      return count;
}
public int countHi2(字符串str){
字符串s=“hi”;
整数计数=0;
如果(str.length()<2){
返回0;
}
else如果(str.length()>=3&&str.charAt(0)='x'&&str.substring(1,3).equals){
count+=countHi2(str.substring(3));
}
else if(str.substring(0,2).equals(s)){
count+=1+countHi2(str.substring(2));
}
否则{
count+=countHi2(str.substring(1));
}
返回计数;
}

第8行需要修改

else if(str.length()>=3 && str.charAt(0) == 'x' && str.substring(1,3).equals(s))
{...}
总代码应为-

public int countHi2(String str) {
  String s = "hi";
      int count = 0;

      if(str.length() < 2) {
          return 0;
      }
      else if(str.length()>=3 && str.charAt(0) == 'x' && str.substring(1,3).equals(s)) {
           count+= countHi2(str.substring(3));
      }
      else if(str.substring(0,2).equals(s)){
          count+= 1 + countHi2(str.substring(2));
      }
      else {
          count+= countHi2(str.substring(1));
      }
      return count;
}
public int countHi2(字符串str){
字符串s=“hi”;
整数计数=0;
如果(str.length()<2){
返回0;
}
else如果(str.length()>=3&&str.charAt(0)='x'&&str.substring(1,3).equals){
count+=countHi2(str.substring(3));
}
else if(str.substring(0,2).equals(s)){
count+=1+countHi2(str.substring(2));
}
否则{
count+=countHi2(str.substring(1));
}
返回计数;
}
修复了一个

public int countHi2(String str) {
    String s = "hi";
    int count = 0;

    if(str.length() < 2) {
        return 0;
    }
    else if(str.charAt(0) == 'x' && str.length() > 2 && str.substring(1,3).equals(s)) {
        count+= countHi2(str.substring(3));
    }
    else if(str.substring(0,2).equals(s)){
        count+= 1 + countHi2(str.substring(2));
    }
    else {
        count+= countHi2(str.substring(1));
    }
    return count;
}
public int countHi2(字符串str){
字符串s=“hi”;
整数计数=0;
如果(str.length()<2){
返回0;
}
else如果(str.charAt(0)='x'&&str.length()>2&&str.substring(1,3).equals){
count+=countHi2(str.substring(3));
}
else if(str.substring(0,2).equals(s)){
count+=1+countHi2(str.substring(2));
}
否则{
count+=countHi2(str.substring(1));
}
返回计数;
}
修复了一个

public int countHi2(String str) {
    String s = "hi";
    int count = 0;

    if(str.length() < 2) {
        return 0;
    }
    else if(str.charAt(0) == 'x' && str.length() > 2 && str.substring(1,3).equals(s)) {
        count+= countHi2(str.substring(3));
    }
    else if(str.substring(0,2).equals(s)){
        count+= 1 + countHi2(str.substring(2));
    }
    else {
        count+= countHi2(str.substring(1));
    }
    return count;
}
public int countHi2(字符串str){
字符串s=“hi”;
整数计数=0;
如果(str.length()<2){
返回0;
}
else如果(str.charAt(0)='x'&&str.length()>2&&str.substring(1,3).equals){
count+=countHi2(str.substring(3));
}
else if(str.substring(0,2).equals(s)){
count+=1+countHi2(str.substring(2));
}
否则{
count+=countHi2(str.substring(1));
}
返回计数;
}

此代码适用于“XXXX”和其他组合。但我还没有检查所有的组合

public static int countHi2(String str) {
      String s = "hi";
      int count = 0;

      if(str.length() < 2) {
          return 0;
      }
      else if((str.length() >= 3) && (str.charAt(0) == 'x' && str.substring(1,3).equals(s))) {
           count+= countHi2(str.substring(3));
      }
      else if(str.substring(0,2).equals(s)){
          count+= 1 + countHi2(str.substring(2));
      }
      else {
          count+= countHi2(str.substring(1));
      }
      return count;
    }
publicstaticintcounthi2(stringstr){
字符串s=“hi”;
整数计数=0;
如果(str.length()<2){
返回0;
}
else如果((str.length()>=3)和&(str.charAt(0)='x'&&str.substring(1,3).equals(s))){
count+=countHi2(str.substring(3));
}
else if(str.substring(0,2).equals(s)){
count+=1+countHi2(str.substring(2));
}
否则{
count+=countHi2(str.substring(1));
}
返回计数;
}

此代码适用于“XXXX”和其他组合。但我还没有检查所有的组合

public static int countHi2(String str) {
      String s = "hi";
      int count = 0;

      if(str.length() < 2) {
          return 0;
      }
      else if((str.length() >= 3) && (str.charAt(0) == 'x' && str.substring(1,3).equals(s))) {
           count+= countHi2(str.substring(3));
      }
      else if(str.substring(0,2).equals(s)){
          count+= 1 + countHi2(str.substring(2));
      }
      else {
          count+= countHi2(str.substring(1));
      }
      return count;
    }
publicstaticintcounthi2(stringstr){
字符串s=“hi”;
整数计数=0;
如果(str.length()<2){
返回0;
}
else如果((str.length()>=3)和&(str.charAt(0)='x'&&str.substring(1,3).equals(s))){
count+=countHi2(str.substring(3));
}
else if(str.substring(0,2).equals(s)){
count+=1+countHi2(str.substring(2));
}