2014-02-28 50 views
2

我寫了這個函數作爲面試練習的一部分。此方法從給定字符串中刪除字符。有效地從字符串中刪除字符

我想知道如何讓這段代碼在運行時/空間上更高效。我認爲我的代碼是O(n),我不確定我是否可以提高效率。但是,也許使用諸如StringBuffer或StringBuilder之類的東西會增加一些呢?不確定,因爲我對Java還是一個新手。

public static String takeOut(String str, char c) { 
    int len = str.length(); 
    String newstr = ""; 
    for (int i = 0; i < len; i++) { 
     if (str.charAt(i) != c) { 
      newstr = newstr + str.charAt(i); 
     } 
    } 
    return newstr; 
} 
+4

沒有,這絕對是*不*爲O(n)。想一想'newstr = newstr + str.charAt(i)'需要做什麼。想象一下,所有n個字符都不是你要找的那個。 (是的,StringBuilder就是你要找的東西。)請參閱http://yoda.arachsys.com/java/stringbuffer.html - 很久以前寫的,但只是用'StringBuilder'替換'StringBuffer'。 –

+0

'replaceAll()'怎麼辦? – shyos

+1

爲什麼不使用'str.replaceAll(c +「」,「」)'? – makata

回答

3

字符串在Java中是不可變的,所以你的答案實際上導致len字符串被創建。這意味着它們被複制len次,所以你在這裏有O(N * N)代碼。 StringBuilder絕對是一個更好的方法。

public static String takeOut(String str, char c) { 
    int len = str.length(); 
    StringBuilder newstr = new StringBuilder(); 
    for (int i = 0; i < len; i++) { 
     if (str.charAt(i) != c) { 
      newstr.append((char)str.charAt(i)); 
     } 
    } 
    return newstr.toString(); 
} 

一個更簡單的方法是使用內置的功能:

public static String takeOut(String str, char c) { 
    return str.replace(String.valueOf(c), ""); 
} 
+0

我認爲你需要修復'StringBuilder newstr = new StringBuilder();' – Liondancer

+1

是的,我做@Liondancer。這就是我得到熬夜和回答stackoverflow問題;-) – Daniel

+0

謝謝你的幫助!非常感激! – Liondancer

2

StringBuilder肯定會阻止你的代碼從每次迭代創建新的字符串。另外,字符串中只包含一次字符嗎?然後你可以在第一場比賽後打破for循環。另外,本地存儲String#charAt的結果不要調用該方法兩次。

+0

多次在字符串內 – Liondancer

+0

該死的,好吧...... :-) – Smutje

1

我的建議來更有效地替換任何字符將是:

1)轉換Stringchar[]陣列。

2)通過排列運行,由一個測試每個character一個和更換,如果需要和StringBuilder

追加,我認爲這可能是你會在純Java獲得最快的性能。

2

你試過

str.replaceAll(c,""); 

? 也許Java運行時是最快的替換方法(刪除)...

+2

不要問一個問題..回答它。 (找出你自己的統計數據) – Astrobleme

+0

這將不會有效 – Kick