從「去掉字串的空格」說起

2022-01-31 15:26:49 字數 2383 閱讀 2477

1. 寫在前面的事情的起因是這樣的,我要處理一段這樣的程式,使用者可以以任意的形式輸入11位數字+空格的形式,然後我要把他分成434的格式。

然後想到的辦法是:

去掉所有空格,然後按照規則劃分成陣列,然後再輸出。

那麼怎麼樣去掉空格,常規的方法這麼幾個:

a. string.replace()

b. string.split(new char,stringsplitoptions.removeemptyentries);

c. system.text.regex()來進行正則替換

d. 有人提出用stringbuilder,但是我們永遠不要忘記stringbuilder的臨界值,在小資料的情況下,使用stringbuilder反而是得不償失的。 

2. 效能大比拼

毋容置疑,使用正則一定是最慢的辦法,再次不做演示。

首先貼出測試**:

static void main(string args)

sw.start();

for (int i = 0; i < 1000; i++)

sw.stop();

console.writeline(sw.elapsedmilliseconds.tostring());

sw.reset();

sw.start();

for (int i = 0; i < 1000; i++)

, stringsplitoptions.removeemptyentries);

}sw.stop();

console.writeline(sw.elapsedmilliseconds.tostring());

}

接下來是測試結果:

正如我們意料中的一樣,replace的效率一定要比split高的,猜測的理由其實很簡單,replace的作用就是用來替換字元,而split是用來拆分,這裡屬於典型的方法亂用。

擴充套件閱讀: 《.net,你忘記了麼?(八)—— 從dynamic到特性誤用》

3. 談談string.split()

我沒有辦法看到string.replace()原始碼,那麼在這裡就只說說string.split()。

大致**可以通過reflector看到,這裡只貼上出核心的**:

public string split(string separator, int count, stringsplitoptions options)

; }

if (flag)

return this.internalsplitkeepemptyentries(seplist, lengthlist, numreplaces, count);

}

首先我們來關注下makeseparatorlist方法,在這個方法裡,微軟通過遍歷分隔符陣列和字串,兩層for迴圈,得到了字串中,每個分隔符所在的索引。接下來就是根據索引來直接分割字串了,無需贅言。

4. 演算法分析

從上面的**,我們可以很輕鬆地看出,演算法的時間複雜度是o(m*n),那麼我們有沒有更優的演算法來實現他呢?

首先,我們要看到演算法的時間複雜度瓶頸在於makeseparatorlist方法,那就來優化這個方法,實現如下:

private static bool makeseparatorlist(char separatorarray)

return chararray;

}

那麼之後我們就可以在遍歷字串的時候,直接通過每個字元的asc2碼來得到這個字元是否是分隔符了。

5. 演算法優劣

既然這樣的演算法時間複雜度小,那為什麼微軟不採用這樣的演算法呢?

時間複雜度並不能決定演算法的優劣,我們所謂的指數型,對數型還是on級,都是針對當資料量大幅度增長時。但是在此問題中,分隔符只有1個,我們卻需要為這乙個字元去宣告乙個大小為255的bool型陣列,這在空間複雜度上是很得不償失的。

那麼該演算法適合什麼?該演算法適合當分隔符具有多個,字串也很長時,那麼o(n)就遠遠小於o(m*n)了。

6. 寫在最後

好久沒有寫東西了,以至於寫寫自己已經不知道自己在寫什麼了。

東西寫得亂七八糟,算了算了…….

只是警醒自己,也警醒各位,.net framework為我們提供了大量的類庫方法支援,但是在用乙個方法之前,我們是否該把這個方法搞清楚,這個方法是否是最優的方法,我們是該自己重新寫乙個方法,還是……

追本溯源,這才是程式設計師該做的。

C 去掉字串空格的方法

1 trim方法string tt aaa tt tt.trim 去字串首尾空格的函式 tt tt.trimend 去掉字串尾空格 tt tt.trimstart 去掉字串首空格 2 通過ascii碼值去掉字元中的空格 由於空格的ascii碼值是32,因此,在去掉字串中所有的空格時,只需迴圈訪問字串...

QString去掉字串中的空格

qstring中去掉多餘空格的方法有三種 1.remove方法來實現 qstring str aa ss ff jj str.remove qregexp s 這種方式會去掉字串中的所有空格。結果 aassffjj 2.simplified qstring str aa t ss n ff r n ...

iOS 字串NSString中去掉空格

問題描述 某些情況下,伺服器返回的字段中含有空格,這空格是伺服器開發人員不小心往資料中多敲了,但客戶端需要保護,所以在客戶端需要把字串中的空格過濾掉。問題分析 1 使用nsstring中的stringbytrimmingcharactersinset nscharacterset whitespac...