1

以下は、API メソッドを呼び出して文字列を逆にするための 2 つの方法です。正当な理由を付けて、どちらのアプローチが優れているか教えてください

public String functionOne(String str){
    char arr[] = str.toCharArray();
    int limit = arr.length/2;
    for (int i = arr.length-1, j = 0; j < limit; i--, j++) {
        char c = arr[i];
        arr[i] = arr[j];
        arr[j] = c;
    }
    return new String(arr);
}

public String functionTwo(String str) {
    StringBuilder strBuilder = new StringBuilder();
    char[] strChars = str.toCharArray();

    for (int i = strChars.length - 1; i >= 0; i--) {
        strBuilder.append(strChars[i]);
    }

    return strBuilder.toString();
}

実際、長さ 100000 の文字列でコードを実行すると、2 番目のアプローチは最初のアプローチの 2 倍の時間がかかりました。System.currentTimeMillis() を使用することで、最初のアプローチで 1、2 番目のアプローチで 2 の実行差が見つかりました。

4

3 に答える 3

6

これはどう:

new StringBuilder("some string").reverse().toString();

このために既に配置されている API は、最も効率的な方法を使用する可能性があります。

于 2013-02-13T09:12:20.827 に答える
1

どちらも同じです。n/21つ目は操作を使用してO(n)おり、2つ目はnO(n)時間の複雑さの操作でそれを行っています。

実際には、両方ともほとんど同じようにうまく動作します。なぜなら、norn/2操作は大きな違いをもたらさないからです。

編集:時間の複雑さの意味がわからない場合は、100万などの長さのランダムな文字列を生成して、両方のアプローチの時間を計算してみてください。

于 2013-02-13T09:18:08.420 に答える
1

2 つ目はより読みやすく、何をしているのかを考えずにざっと目を通すことができます。私は毎回それで行きます(ミリ秒速くする必要がある正当な理由がない限り?)

最初のものは私の脳を数秒間止めます。つまり、危険であり、将来の変更によって簡単に壊れる可能性があります。コメントが必要か、(2 番目のもので) 置換する必要があります。

于 2013-02-13T09:40:41.387 に答える