在字串中找出第乙個只出現一次的字元。如輸入「abaccdeff」,則輸出』b』。
看到這題時,我們最直觀的想法是從頭開始掃瞄這個字串中的每個字元。當訪問到某字元時,拿這個字元和後面的每個字元相比較,如果在後面沒有發現重複的字元,則該字元就是只出現一次的字元。如果字串有n個字元,則每個字元可能與後面的o(n)個字元相比較,因此這種思路的時間複雜度是o(n*n)。面試官不會滿意這種思路,它會提示我們還有更快的方法。
由於題目與字元出現的次數相關,那麼我們是不是可以統計每個字元在該字串**現的次數?要達到這個目的,我們需要乙個資料容器來存放每個字元的出現次數。在這個資料容器中,可以根據字元來查詢它出現的次數,也就是說這個容器的作用是把乙個字元對映成乙個數字。在常用的資料容器中,雜湊表正式這個用途。
為了解決這個問題,我們可以定義雜湊表的鍵值(key)是字元,而值(value)是該字元出現的次數。同時我們還需要從頭開始掃瞄字串兩次。第一次掃瞄字串時,每掃瞄到乙個字元,就在雜湊表的對應項中把次數加1.接下來第二次掃瞄是,每掃瞄到乙個字元,就能從雜湊表中得到該字元出現的次數。這樣,第乙個只出現一次的字元就是符合要求的輸出。
雜湊表是一種比較複雜的資料結構,c++標準模板庫中的map和unordered_map實現了雜湊表的功能,我們可以直接拿過來用。由於本題的特殊性,我們起始只需要乙個非常簡單的雜湊表就能滿足要求,因此我們可以考慮實現乙個簡單的雜湊表。字元(char)是乙個長度為8的資料型別,因此總共有256中可能。於是我們建立乙個長度為256的陣列,每個字母根據其ascii碼值作為陣列的下標對應陣列的乙個數字,而陣列中儲存的是每個字元出現的次數。這樣我們就建立了乙個大小為256、以字元ascii碼作為鍵值的雜湊表。
第一次掃瞄時,在雜湊表中更新乙個字元出現的次數的時間是o(1)。如果字串長度為n,那麼第一次掃瞄的時間複雜度是o(n)。第二次掃瞄時,同樣在o(1)時間內讀出乙個字元出現的次數,所以事件複雜度仍然是o(n)。這樣算起來,總的時間複雜度是o(n)。同時我們需要乙個包含256個字元的輔助陣列,它的大小是1kb。由於這個陣列的大小是乙個常數,因此可以認為這種演算法的空間複雜度是o(1)。
當我們向面試官講述清楚這種思路並得到面試官的首肯之後,就可以動手寫**了。下面是一段參考**:
char
firstnotrepeatingchar
(char
* pstring)
return
'\0'
;}
在英語中,如果兩個單詞**現的字元相同,並且每個字母出現的次數也相同,那麼這兩個單詞互為變位詞。例如,silent與listen,evil和live互為變位詞。請完成乙個函式,判斷輸入的兩個字串是不是互為變位詞。我們可以建立乙個用陣列實現的簡單雜湊表,用來統計字串中每個字元出現的次數。當掃瞄到第乙個字串中的每個字元時,為雜湊表對應的項的值增加1.接下來掃瞄第二個字串,當掃瞄到每個字元時,為雜湊表對應的項的值減去1.如果掃瞄完第二個字串後,雜湊表中所有的值都是0,那麼這兩個字串就互為變位詞。 面試題50 第乙個只出現一次的字元
在乙個字串 0 字串長度 10000,全部由字母組成 中找到第乙個只出現一次的字元,並返回它的位置,如果沒有則返回 1 需要區分大小寫 解題思路 字元 key 字元出現的次數 value 雜湊表 1.第一遍遍歷陣列,找到每個字元對應的次數。輔助陣列下標key為陣列字元的ascii碼 輔助陣列的值va...
面試題35 第乙個只出現一次的字元
題目 在字串中找出第乙個只出現一次的字元。如輸入 abaccdeff 則輸出 b 看到這個題目,最直觀的想法就是就是遍曆法,也就是從頭開始取字串中的乙個字元,將其與其後的所有字元比較,如果有相同的字元,那麼就證明它不是只出現一次的字元。當第一次出現遍歷完其後字元並且沒有重複時,表明這個字元就是 第乙...
面試題35 第乙個只出現一次的字元
題目 在字串中找出第乙個只出現一次的字元。如輸入 abaccdeff 則輸出 b 看到這個題目,最直觀的想法就是就是遍曆法,也就是從頭開始取字串中的乙個字元,將其與其後的所有字元比較,如果有相同的字元,那麼就證明它不是只出現一次的字元。當第一次出現遍歷完其後字元並且沒有重複時,表明這個字元就是 第乙...