程式設計師面試題精選 在字串中刪除特定的字元

2021-06-16 09:15:59 字數 1447 閱讀 4167

分類: 程式設計師面試題

c/c++

2011-10-06 15:28

189人閱讀

收藏 舉報

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

要程式設計完成這道題要求的功能可能並不難。畢竟,這道題的基本思路就是在第乙個字串中拿到乙個字元,在第二個字串中查詢一下,看它是不是在第二個字串中。如果在的話,就從第乙個字串中刪除。但如何能夠把效率優化到讓人滿意的程度,卻也不是一件容易的事情。也就是說,如何在第乙個字串中刪除乙個字元,以及如何在第二字串中查詢乙個字元,都是需要一些小技巧的。

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

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

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

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

下邊是我的實現**:

[cpp]view plain

copy

print?

#include

using

namespace std;

void deletechars(char *first, char *second)

++fast;

} *slow = '\0';

} int main()

程式設計師面試題精選

問題描述 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a b c所能排列出來的所有字串abc acb bac bca cab和cba。問題分析 這是一道很好的考查對遞迴理解的程式設計題。寫遞迴程式關鍵有兩點,處理好進入與返回的關係,進入時改變了什麼,返回時應當恢復。字...

程式設計師面試題精選100題 字串的排列 演算法

題目 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串 abc,則輸出由字元a b c所能排列出來的所有字串 abc acb bac bca cab和 cba。分析 這是一道很好的考查對遞迴理解的程式設計題,因此在過去一年中頻繁出現在各大公司的面試 筆試題中。我們以三個字元abc為例來分析一...

程式設計師面試題精選100題

今天開始各種刷面試題,沉下心來集中時間,全身心投入 題目 輸入一棵二元查詢樹,將該二元查詢樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只調整指標的指向。比如將二元查詢樹 10 6 14 4 8 12 16 轉換成雙向鍊錶 4 6 8 10 12 14 16。相關概念 二元查詢樹 它首先要是...