1

私はこのCodingBat再帰の問題で立ち往生しています:

文字列を指定すると、同じである隣接する文字が1つの文字に縮小された「クリーンな」文字列を再帰的に返します。したがって、「yyzzza」は「yza」を生成します。

stringClean("yyzzza") → "yza"
stringClean("abbbcdd") → "abcd"
stringClean("Hello") → "Helo"

ループを使用して解決できますが、問題は再帰を使用して解決されると想定されているため、これは許可されていません。ループを使用せず、再帰のみを使用してこの問題を解決する方法はありますか?グローバル変数もループもありません。パラメータにいくつかの情報をエンコードすることも考えましたが、それも不正行為だと思います。

以前のプログラムにはwhileループがなく、正解の半分しか得られませんでした。基本的に、文字列パラメーターを使用して関数を呼び出すと、最初の2文字をチェックしました。それらが同じである場合、文字を返し、2文字小さい文字列を使用して関数を再度呼び出します。ただし、同じ連続する文字の3つまたは4つの文字列は、常に私のアルゴリズムを無効にします。

public String stringClean(String str) {

    if (str.length() == 0)
        return "";

    if (str.length() > 1) {

    int counter = 1;


      char a = str.charAt(0);
      char b = str.charAt(1);

       if (a == b)
       {
          while (str.length() > 1)
          {
             a = str.charAt(0);
             b = str.charAt(1);

             if (a != b) break;

             counter++;
             str = str.substring(1);


          }

           return a + stringClean( str.substring(1) ) ;
       }

    }

    return str.charAt(0) + stringClean (str.substring(1) );

}
4

4 に答える 4

6

私の質問は次のとおりです。ループを使用せず、再帰のみを使用してこの問題を解決する方法はありますか。グローバル変数もループもありません。

回答:はい。とても簡単です。以下をお試しください:

 public String stringClean(String str) {
      if (str.length() == 0)
            return "";
      if (str.length() == 1)
            return str;

      if(str.charAt(0) == str.charAt(1)){
         return stringClean(str.substring(1));   
      }else{
        return str.charAt(0)+ stringClean(str.substring(1));
      }    
    }

CodingBatの結果は次のようになります。

stringClean( "yyzzza")→ "yza" "yza" OK
stringClean( "abbbcdd")→ "abcd" "abcd" OK
stringClean( "Hello")→ "Helo" "Helo" OK
stringClean( "XXabcYY")→ " XabcY "" XabcY " OK
stringClean(" 112ab445 ")→" 12ab45 "" 12ab45 " OK
stringClean(" Hello Bookkeeper ")→" Helo Bokeper "" Helo Bokeper" OK
その他のテスト OK

于 2012-12-01T23:48:34.453 に答える
1

私の質問は次のとおりです。ループを使用せず、再帰のみを使用してこの問題を解決する方法はありますか。グローバル変数もループもありません。

答えは「はい、それは可能です」です。

ヒント:

  • ほとんどの「トリッキーな」再帰的な問題と同様に、これには追加のパラメーターが必要です。
  • この問題は、各段階で文字列の最初の文字をフィルタリングすることと考えてください。
  • 入力文字列の最初の文字は特殊なケースです...
于 2012-12-01T23:40:59.210 に答える
0
public String stringClean(String str) {
    if (str == null) {
        return null;
    } else if (str.length() > 1) {
        String k = str.substring(0, 1);
        if (str.charAt(0) == str.charAt(1)) {
            String tmp = stringClean(str.substring(2));
            return k + stringClean(tmp);
        } else {
            return k + stringClean(stringClean(str.substring(1)));
        }
    } else {
        return str;
    }
}
于 2013-10-26T15:46:15.827 に答える
0

これが私の答えです

public String stringClean(String str) {
  if(str.isEmpty()) return "";
  if(str.length()==1)return str;

  if(str.length() > 1 && !str.substring(0,1).equals(str.substring(1,2)))
    return str.substring(0,1) + stringClean(str.substring(1));

  return ""+stringClean(str.substring(1));

}
于 2019-11-12T11:36:21.507 に答える