1

私はコーディングバットから問題を起こしていますが、この問題で立ち往生しています。質問では、文字列内のすべてを検索するように求められますが、それらの直前にある は'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;
    }
}

(null 値を処理せず、実際には最適化されていません。)

于 2012-06-05T09:38:39.210 に答える
2

問題は、文字列の最後 (または最後の 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;
}
于 2012-06-05T09:36:48.680 に答える
2

beginIndex が負の場合、または endIndex がこの String オブジェクトの長さより大きい場合、または beginIndex が endIndex より大きい場合にsubstringスローIndexOutOfBoundsExceptionされるため、例外が発生します。長さが少なくとも 2 であることを確認してから実行するとsubstring(1, 3)、例外が発生します。

文字列を長いものと比較しても例外をスローしない API に切り替えることでIndexOutOfBoundsException、inの問題を回避できます。substringstartsWith

于 2012-06-05T09:37:20.197 に答える
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 に答える
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 に答える
0

あなたはこの線に到達することはありません

return count;

入力が「xxxx」の場合は常に if else を使用しています。

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

「xx」が 2 文字残っていて、最初の条件をチェックすると、str.substring(1,3)そのエラーが発生したときです。その場合、 が 2 でないことを確認する必要がありますstr.lenght()。たとえば、次のようになります。

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 に答える