- 來源 | 願碼(ChainDesk.CN)內容編輯
- 願碼Slogan | 鏈接每一個程序員的故事
- 網站 | http://chaindesk.cn
- 願碼願景 | 打造全學科IT系統免費課程,助力小白用戶、初級工程師0成本免費系統學習、低成本進階,幫助BAT一線資深工程師成長並利用自身優點創造睡後收入。
- 官方公衆號 | 願碼 | 願碼服務號 | 區塊鏈部落
- 免費加入願碼全思惟工程師社羣 | 任一公衆號回覆「願碼」兩個字獲取入羣二維碼
本文閱讀時長:5min程序員
當下,谷歌的面試時常被程序員說起。有時,面試能讓咱們發揮最好的一面,從而得到咱們想要的職位。
本文咱們將討論一個可能出如今Google面試中的經典問題。面試
給定一個字符串做爲輸入,刪除任何重複出現的字符,並返回新字符串。算法
正如咱們從上面的例子中看到的那樣,輸出是「abc」,由於咱們刪除了第二個'a','b'和'c'。
首先,讓咱們在Python 2.7中設置咱們的功能。數組
def deleteReoccurringCharacters(string):
爲了解決這個問題,咱們將使用一個名爲HashSet的特定數據結構。數據結構
您能夠將集合視爲與數組相似,但有兩個主要例外。學習
由於它是無序的,咱們還須要一個空字符串來存儲咱們按順序添加到集合中的字符。這將是咱們返回的字符串。
咱們來設置一下區塊鏈
def deleteReoccurringCharacters(string): seenCharacters = set() outputString = ''
如今咱們已經創建了咱們須要的數據結構,讓咱們再來談談咱們的算法。
因爲集合在內存中的工做方式,它的查找時間複雜度爲0(1)。
這意味着咱們能夠用它來檢查咱們是否已經訪問過一個角色!網站
遍歷初始字符串中的全部字符並執行如下操做:
第1步:檢查角色是否已經在咱們的設置中
第2歩:若是它不在集合中,則將其添加到集合中並將其附加到字符串
讓咱們看看代碼中的內容編碼
for char in string: if char not in seenCharacters: seenCharacters.add(char) outputString += char
咱們沒必要擔憂「else」狀況,由於咱們不須要處理重複出現的字符自己。如今剩下要作的就是返回outputString。
這是完成的代碼的樣子:spa
def deleteReoccurringCharacters(string): seenCharacters = set() outputString = '' for char in string: if char not in seenCharacters: seenCharacters.add(char) outputString += char return outputString
若是這是一次面試,招聘人員會問你時間和空間的複雜性。咱們來分析一下。
迭代整個輸入字符串的時間複雜度爲O(n),由於字符串自己有n個字符。
可是,因爲HashSet的查找時間爲O(1),因此不會影響時間複雜度。最後的時間複雜度爲O(n)。
最糟糕的狀況是,咱們獲得一個包含全部惟一字符的字符串。例如,「abcdef」。在這種狀況下,咱們將在字符串和集合中存儲全部n個元素。然而,咱們也受到英語字母大小的限制。這是一個很好的機會來問咱們的面試官什麼類型的字符在字符串中是惟一的(大寫/小寫/數字/符號)。假設初始字符串將包含字母表中的小寫字母,由於字母表是有限的,因此集合和輸出字符串不能大於26個字符。留給咱們最壞的狀況空間複雜度爲O(1)。