使用递归来查找字符串中的“hi”数而不是“xhi”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用递归来查找字符串中的“hi”数而不是“xhi”相关的知识,希望对你有一定的参考价值。

我正在使用codingbat做一个问题而且我遇到了这个问题。这个问题要求我找到字符串中的所有'hi',但忽略在它们之前有'hi''x'。换句话说,不要计算'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;
}

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

答案

你看到一个异常,因为substring throws IndexOutOfBoundsException if the beginIndex is negative, or endIndex is larger than the length of this String object, or beginIndex is larger than endIndex.你检查长度至少为2,然后做substring(1, 3),导致异常。

您可以通过切换到IndexOutOfBoundsException API来避免substringstartsWith的问题,即使您将字符串与较长的字符串进行比较也不会抛出异常。

另一答案

如果您不必使用递归:

public int countHi(String test) {
        if (test == null){
            return 0;
        }
        test = test.replaceAll("xhi", "");
        int n1 = test.length();
        int n2 = test.replaceAll("hi", "").length();
        return (n1-n2)/2;

    }
另一答案

下面是获取特定字符串中“hi”计数的代码。

public int countHi(String str) {
 int count = 0;
 int len = str.length();
 if(len<2) {
  return 0;
 }
 else {
   if(str.substring(0,2).equals("hi")) {
     return count+1+countHi(str.substring(2));
   }
   else {
     return count+countHi(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;
    }
}

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

另一答案

问题是如果你的字符串末尾有一个'x'(或者最后2个位置之一),你的子字符串将从一个超出范围的索引开始(正如你的异常所告诉你的那样)。如果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;
}
另一答案

第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(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;
}
另一答案

此代码将很好地用于'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;
    }
另一答案

你永远不会到达这条线

return count;

如果您的输入是“xxxx”,您一直在使用if else

count+= countHi2(str.substring(1));
另一答案

如果你有2个字母仍然是“xx”并且你检查了第一个条件,那么当你得到那个错误时你会做str.substring(1,3)。在这种情况下,您应该检查str.lenght()不是2,例如:

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

    if(str.length() < 2) {
        return 0;
    }
    else if(str.length()>2 && 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(String str) {
  return (str.length() < 2)?0:
         (str.substring(0,2).equals("xh"))?
           countHi2(str.substring(2)):
           (str.substring(0,2).equals("hi"))?
               1 + countHi2(str.substring(1)):
               countHi2(str.substring(1));   
}

或者看起来太奇怪了:

public int countHi2(String str) {
   if(str.length() < 2)
     return 0;
   else if(str.substring(0,2).equals("xh"))
     return countHi2(str.substring(2));
   else (str.substring(0,2).equals("hi"))
     return 1 + countHi2(str.substring(1));
   else return countHi2(str.substring(1));   
}

以上是关于使用递归来查找字符串中的“hi”数而不是“xhi”的主要内容,如果未能解决你的问题,请参考以下文章

带有尾递归函数c ++的堆栈溢出

Java 递归计数

DSum 返回行数而不是总值

关于java中的递归

使用递归js查找树状对象(不是二叉树)的最低共同祖先

如何显示两位数而不是一个 Twig [重复]