-3

だから私はJavaコーディングバットに取り組んでいます、そしてこれは質問です:

文字列を指定して、指定された文字列の最初と最後の両方で鏡像(後方)文字列を探します。
つまり、指定された文字列の最初と、文字列の最後で逆の順序(重複している可能性があります)の0個以上の文字。

例: 文字列「abXYZba」のミラーエンドは「ab」です。mirrorEnds( "abXYZba")→ "ab" mirrorEnds( "abca")→ "a" mirrorEnds( "aba")→"aba"。

私のコードは、指定されていない他のテストを除いて、すべてのテストに合格しました。何が悪いのかわかりません。

  public String mirrorEnds(String string) {
  String input = string, mirror = "";
            int length = string.length();


            for (int n = 0; n < (length+1) / 2; n++) {


                if (input.charAt(n) != input.charAt(length - n - 1)) {

                    break;
                }else if(length%2 == 1 && n == (length - 1)/2){
//                    System.out.println("length/2 = " );

                    return input;
                } 
                else {
                    mirror += input.charAt(n);
                }
            }

            return  mirror;
}
4

5 に答える 5

1

単語全体を調べる必要がないという点では正解でしたが、ロジックが必要以上に複雑であるため、問題を見つけて修正するのが難しくなっています。テスト失敗の根本原因は、最後のreturnステートメントにあります。stringループが中断せずに完了した場合は、返さなければなりません。に変更し、最後をに変更break;することでコードを修正できますreturn mirror;return mirror;return input;

失敗しているテストは次のようなものです。

 mirrorEnds("abba") -> "abba"

コードのはるかに単純なバージョンは、次のように作成できます。

public String mirrorEnds(String string) {
    int len =  string.length();
    for (int i=0; i < len/2; ++i)
        if (string.charAt(i) != string.charAt(len - 1 - i))
            return string.substring(0, i);
    return string;
}
于 2013-12-19T01:46:58.347 に答える
0

私が試した最初のテストは、"abba"失敗した文字列を使用したものでした。abbaではなくabを返します。femtoRgonが述べたように、あなたは単語全体を調べているわけではありません。それは時々必要かもしれません。femtoRgonのソリューションは機能するだけでなく、次のように単語を反復処理するためにわずかに異なるアプローチを取ります。

public String mirrorEnds(String string) {
    boolean matches = true;
    StringBuilder mirrorEnd = new StringBuilder();
    int index = 0;
    while (matches && index < string.length()) {
        if (string.charAt(index) == string.charAt(string.length() - index - 1))
            mirrorEnd.append(string.charAt(index));
        else
            matches = false;
        index++;
    }
    return mirrorEnd.toString();
}
于 2013-01-17T19:13:08.607 に答える
0

mirrorEnds("アバ")?

とにかく、「奇妙なもの」よりも適切な質問名を思い付くことができると確信しています...

于 2013-01-17T18:51:59.507 に答える
0

ループ終了条件で n を 2 で除算しているため、単語の途中で終了します。これは単語が回文であることを伝えるには十分ですが、出力を正しく構築するには十分ではありません。文字数が奇数の回文を処理する条件がありますが、文字数が偶数ではありません。失敗したテストは「abba」の形式になると思います。ここで、「abba」ではなく「ab」が返されると思います。

変更すると、次のようにループします。

for (int n = 0; n < length; n++) {

私はそれがあなたが望むことをするべきだと信じています。これにより、短絡ケースも不要になるため、次のようになります。

        for (int n = 0; n < length; n++) {
            if (input.charAt(n) != input.charAt(length - n - 1)) {
                break;
            } 
            else {
                mirror += input.charAt(n);
            }
        }
于 2013-01-17T19:05:25.907 に答える