2013-02-13 66 views
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。

+0

我對此不太確定,但我認爲第一種方法更好 – KyelJmD 2013-02-13 09:12:51

+1

更好=更快?更可讀? – 2013-02-13 09:13:27

+0

你的符號不一致:'char arr []'與'char [] strChars'。前者支持主要是爲了緩解從C++的過渡,而後者更易於讀取IMO。 – 2013-02-13 09:15:10

回答

6

如何:

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

已經到位這很可能會使用最有效的方式API。

+0

+1在Java中反轉String的最簡單方法。 – 2013-02-13 09:22:05

1

兩者都是一樣的。首先是使用n/2操作,它是O(n),第二個操作是n操作,這也是O(n)時間複雜度。

在實踐中,兩者幾乎同樣好,因爲nn/2操作不會有太大的區別。

編輯:如果你沒有得到時間複雜度的意思,請嘗試生成一個大型的隨機字符串,例如100萬,並計算兩種方法的時間。

+0

「對於每個多項式時間算法,都有一個我寧願運行的指數算法。」 - Alan Perlis – 2013-02-13 09:18:58

1

其次是更具可讀性:我可以瀏覽,而不必考慮它在做什麼。我會每次都去(除非有充分的理由,爲什麼你需要它毫秒更快?)

第一個停止我的大腦幾秒鐘。這意味着它很危險,而且很容易被未來的變化破壞。它要麼需要評論,要麼取代(與第二個)。