0

このCodingBat の問題を解決しようとしています:

文字列の 2 つの配列 A と B から始めます。それぞれの要素はアルファベット順で、重複はありません。2 つの配列から最初の N 要素を含む新しい配列を返します。結果の配列はアルファベット順で、重複がない必要があります。A と B は両方とも N 以上の長さになります。最良の「線形」ソリューションは、A と B に対して単一のパスを作成し、それらがアルファベット順であるという事実を利用して、要素を新しい配列に直接コピーします。

mergeTwo({"a", "c", "z"}, {"b", "f", "z"}, 3) → {"a", "b", "c"}
mergeTwo({"a", "c", "z"}, {"c", "f", "z"}, 3) → {"a", "c", "f"}
mergeTwo({"f", "g", "z"}, {"c", "f", "g"}, 3) → {"c", "f", "g"}

試み:

public String[] mergeTwo(String[] a, String[] b, int n) {
    String[] op = new String[a.length + b.length];
    for (int i = 0; i < a.length; i++) {
        op[i] = a[i];
    }
    int j = 0;
    for (int i = 0; i < op.length; i++) {
        if (op[i] == null) {
            j = i;
            break;
        }
    }
    for (int i = 0; i < b.length; i++) {
        op[j] = b[i];
        j++;
    }
    Arrays.sort(op);
    ArrayList<String> help = new ArrayList<String>();

    for (int i = 0; i < op.length - 1; i++) {
        if (op[i] != op[i + 1]) {
            help.add(op[i]);
        }
    }
    String[] res = new String[help.size()];
    for (int i = 0; i < help.size(); i++) {
        res[i] = help.get(i);
    }
    String[] op2 = new String[n];
    for (int i = 0; i < n; i++) {
        op2[i] = res[i];
    }
    return op2;

}

したがって、問題は、1 つを除いてすべてのテストがパスすることです。

ここに画像の説明を入力

何故ですか?

4

2 に答える 2

1

これは問題のある行です:

 if (op[i] != op[i + 1]) {

いくつかの同一の文字列の lsst が次の文字列と一致しないパターンを探しています。

失敗した場合、一意の文字列がちょうど 3 つあるため、「次の文字列」はありません。

これに対処する 1 つの方法は、この文字列が最後の文字列とは異なるパターンを探すことですが、最後の文字列の配列を実際にはチェックしません (最初の配列要素には最後の文字列がないため)。たとえば、変数を使用しlastて最後の文字列を格納し、この要素が と等しくない場合にのみ転送しlastます。

これを試して ...

String last = "";
for (int i = 0; i < op.length - 1; i++) {
    if (!op[i].equals(last)) {
        help.add(op[i]);
    }
    last = op[i];
}

また、Java では文字列がメソッドと比較されることに注意してくださいequals()

于 2013-04-17T19:52:52.677 に答える