從字串中刪除指定字元

來源:互聯網
上載者:User

http://bidlcy514.blog.163.com/blog/static/105491943201062693329886/

 

前一段時間去HULU筆試的時候,就出了這樣一個題,以為很簡單,直接用的如果遇到就直接刪除,而且後面的所有元素順序前移,這樣效率太低,而且沒有創新性,問題分為兩步,一個是尋找到字元,另一個是刪除字元,這兩種都有簡便方法,看似平常的題,確實微軟的面試題喲

題目:輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。例如,輸入”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表。這種思路的詳細說明,詳見本面試題系列的第13題。

 

#include <stdio.h>

#include <conio.h>

 

char TheArray[256];

 

void InitTheArray(const char * szFind)

{

    while('/0'!=*szFind)

        TheArray[*szFind++] = 1;

}

 

void ProcessTheString(char * szDestination)

{

    char * pFast;

    char * pSlow;

 

    pFast = pSlow = szDestination;

 

    while ('/0'!=*pFast)

    {

        if(0==TheArray[*pFast])

            *pSlow++ = *pFast++;        

        else

            pFast++;

    }

 

    *pSlow = '/0';

}

 

int main()

{

    char szDes[] = "They are Students.";

    char szFind[] = "aeiou";

 

    InitTheArray(szFind);

    ProcessTheString(szDes);

 

    printf("%s", szDes);

 

    _getch();

    return 0;

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.