1

我正在从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。可以在此处找到问题的链接。

4

11 回答 11

3

您可以执行以下操作:

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;
    }
}

(它不处理空值,而且它确实没有优化。)

于 2012-06-05T09:38:39.210 回答
2

问题是,如果您的字符串末尾有一个“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;
}
于 2012-06-05T09:36:48.680 回答
2

您会看到一个异常,因为如果 beginIndex 为负数,或者 endIndex 大于此 String 对象的长度,或者 beginIndex 大于 endIndex,则会substring引发异常。IndexOutOfBoundsException您检查长度是否至少为 2,然后执行substring(1, 3),导致异常。

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

于 2012-06-05T09:37:20.197 回答
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;
}
于 2012-06-05T09:39:36.780 回答
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;
}
于 2012-06-05T09:39:54.383 回答
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;
    }
于 2012-06-05T09:41:40.977 回答
0

你永远不会到达这条线

return count;

当您的输入为“xxxx”时,您一直在使用 if else

count+= countHi2(str.substring(1));
于 2012-06-05T09:37:40.913 回答
0

当您剩下 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;
}
于 2012-06-05T09:54:18.187 回答
0

你们太复杂了。这是一个简单的解决方案。

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));   
}
于 2015-02-16T01:58:03.497 回答
0

如果您不必使用递归:

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;

    }
于 2015-02-16T02:26:17.387 回答
0

下面是获取特定字符串中“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));
   }
 }
}
于 2018-05-24T03:45:49.207 回答