1

以下是通过调用 API 方法来反转字符串的两种方法。请在有正当理由的情况下说明哪种方法更好

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 的字符串上运行我的代码时,第二种方法花费的时间是第一种方法的两倍。通过使用 System.currentTimeMillis() 我发现第一种方法中的执行差异为 1,第二种方法中的执行差异为 2。

4

3 回答 3

6

这个怎么样:

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

已经为此准备的 API 可能会使用最有效的方式。

于 2013-02-13T09:12:20.827 回答
1

两者都一样。第一个是使用n/2操作,O(n)第二个是在操作中进行n操作,这也是 O(n) 时间复杂度。

在实践中,两者的运行几乎一样好,因为nn/2操作不会有太大的不同。

编辑:如果您不了解时间复杂度的含义,请尝试生成一个大长度的随机字符串,例如 100 万,并计算两种方法的时间。

于 2013-02-13T09:18:08.420 回答
1

第二个更具可读性:我可以浏览它而不必考虑它在做什么。我每次都会这样做(除非有充分的理由需要它快几毫秒?)

第一个让我的大脑停了几秒钟。这意味着它很危险,很容易被未来的变化破坏。它要么需要评论,要么需要替换(用第二个)。

于 2013-02-13T09:40:41.387 回答