在字串中刪除特定的字元

2022-03-30 23:14:09 字數 2261 閱讀 4297

傳說這是一道知名外企的筆試題

但是看了一些文章,都只是單純的轉了那個演算法,弱弱的說一句,那個演算法中把'\0'寫成了'/0',會導致在

while ('

/0' != *ptemp)

這一步的時候,一直迴圈下去,直到系統中斷。不過除錯的時候發現了乙個很有意思的事情,就是之前ptemp之前是指向aeiou,這就是傳入的第二個引數,當遍歷完這個引數之後,ptemp會繼續指向棧中的下乙個位址,也就是第乙個引數they are students的位址,這個正好映證了《深入理解計算機系統》上的內容,也說明了這玩意是多麼多麼的不安全啊。

說了這麼多,還是看看具體的這道題目吧。

題目:輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。例如,輸入」they are students.」和」aeiou」,則刪除之後的第乙個字串變成」thy r stdnts.」。

首 先我們考慮如何在字串中刪除乙個字元。由於字串的記憶體分配方式是連續分配的。我們從字串當中刪除乙個字元,需要把後面所有的字元往前移動乙個位元組的 位置。但如果每次刪除都需要移動字串後面的字元的話,對於乙個長度為n的字串而言,刪除乙個字元的時間複雜度為o(n)。而對於本題而言,有可能要刪 除的字元的個數是n,因此該方法就刪除而言的時間複雜度為o(n^2)。

這個演算法我也弱弱的實現了一下,一會兒一起貼出來。

事 實上,我們並不需要在每次刪除乙個字元的時候都去移動後面所有的字元。我們可以設想,當乙個字元需要被刪除的時候,我們把它所佔的位置讓它後面的字元來填 補,也就相當於這個字元被刪除了。在具體實現中,我們可以定義兩個指標(pfast和pslow),初始的時候都指向第一字元的起始位置。當pfast指 向的字元是需要刪除的字元,則pfast直接跳過,指向下乙個字元。如果pfast指向的字元是不需要刪除的字元,那麼把pfast指向的字元賦值給 pslow指向的字元,並且pfast和pstart同時向後移動指向下乙個字元。這樣,前面被pfast跳過的字元相當於被刪除了。用這種方法,整個刪 除在o(n)時間內就可以完成。

這一步其實還是蠻不好理解的,或者我太菜了,第一次沒有理解清楚,看了除錯的過程,才明白了,這段話是什麼意思。這段話對應的就是下面這段**

while ('\

0' != *pfast)

++pfast;

}

初始時,pfast和pslow都指向 they are students 的第乙個字元,之後如果pfast指向的不是要刪除的字元(這是if判斷的內容),則pfast和pslow一起移動,知道他們都指向e,這時候,不進入if,pfast繼續移動,pslow還是指向e,當pfast指向y的時候,進入if,這時候,就將pslow指向的e,替換成了pfast指向的y,也就是這段話的含義。

接下來就是分析,如何更快的確定pfast指向的字元,是在要刪除的字符集中,這裡使用了hash的思想。

接下來我們考慮如何在乙個字串中查詢乙個字元。當然,最簡單的辦法就是從頭到尾掃瞄整個字串。顯然,這種方法需要乙個迴圈,對於乙個長度為n的字串,時間複雜度是o(n)。

由 於字元的總數是有限的。對於八位的char型字元而言,總共只有28=256個字元。我們可以新建乙個大小為256的陣列,把所有元素都初始化為0。然後 對於字串中每乙個字元,把它的ascii碼對映成索引,把陣列中該索引對應的元素設為1。這個時候,要查詢乙個字元就變得很快了:根據這個字元的 ascii碼,在陣列中對應的下標找到該元素,如果為0,表示字串中沒有該字元,否則字串中包含該字元。此時,查詢乙個字元的時間複雜度是o(1)。 其實,這個陣列就是乙個hash表。

完整的**如下:

//

從str中,刪除乙個指定的字元

void deleteonechar(char* str, char

tobedelete)

}return;}

//使用第一種方法實現 複雜度o(n^2)

void deletechars1(char* str,const

char*chars)

//使用第二種方法實現複雜度o(n)

void deletechars2(char* pstrsource, const

char*pstrdelete)

char* pslow =pstrsource;

char* pfast =pstrsource;

while ('

\0' != *pfast)

++pfast;

} *pslow = '\0'

;

} int

main()

在字串中刪除特定字元

第一種方法 遍歷原陣列,在待刪陣列裡遍歷是否刪除該元素 char removechars char str,const char remove if state temp count str i state true i temp count 0 return temp 第二種方法 時間複雜度o n...

在字串中刪除特定的字元(字串)。

題目 輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。例如,輸入 they are students.和 aeiou 則刪除之後的第乙個字串變成 thy r stdnts.其實這類題有個特點,字串中的字元分為兩類,就可以聯想快速排序裡的將當前的陣列分為左右兩組,其中左邊的數字小於某值,右邊的數...

在字串中刪除特定的字元

題目 輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。例如,輸入 they are students.和 aeiou 則刪除之後的第乙個字串變成 thy r stdnts.分析 這是一道微軟面試題。在微軟的常見面試題中,與字串相關的題目佔了很大的一部分,因為寫程式操作字串能很好的反映我們的程式...