劍指offer 第乙個只出現一次的字元

2021-10-18 23:02:40 字數 1547 閱讀 4461

題目35:第乙個只出現一次的字元(leetcode連線:

問題分析

看到這道題時,我們最直觀的想法是從頭開始掃瞄這個字串中的每個字元。當訪問到某字元時拿這個字元和後面的每個字元相比較,如果在後面沒有發現重複的字元,則該字元就是只出現一次的字元。如果字串有n個字元,每個字元可能與後面的o(n)個字元相比較,因此這種思路的時間複雜度是o(n)。面試官不會滿意這種思路,他會提示我們還有更快的方法。

由於題目與字元出現的次數相關,我們是不是可以統計每個字元在該字串**現的次數,要達到這個目的,我們需要乙個資料容器來存放每個字元的出現次數。在這個資料容器中可以根據字元來查詢它出現的次數,也就是說這個容器的作用是把乙個字元對映成乙個數字。在常用的資料容器中,雜湊表正是這個用途。為了解決這個問題,我們可以定義雜湊表的鍵值(key)是字元,而值( value)是該字元出現的次數。同時我們還需要從頭開始掃瞄字串兩次

欠。第一次掃瞄字串時,每掃瞄到乙個字元就在雜湊表的對應項中把次數加1。接下來第二次掃瞄時,每掃瞄到乙個字元就能從雜湊表中得到該字元出現的次數。這樣第乙個只出現一次的字元就是符合要求的輸出。

雜湊表是一種比較複雜的資料結構,並且 c++的標準模板庫中沒有實現雜湊表。接下來我們要考慮的問題就是如何實現雜湊表。由於本題的特殊性,我們只需要乙個非常簡單的雜湊表就能滿足要求。字元(char)是乙個長度為8的資料型別,因此總共有256種可能。於是我們建立乙個長度為256的陣列,每個字母根據其ascii 碼值作為陣列的下標對應陣列的個數字,而陣列中儲存的是每個字元出現的次數。這樣我們就建立了乙個大小為256,以字元ascii碼為鍵值的雜湊表。第一次掃瞄時,在雜湊表中更新乙個字元出現的次數的時間是o(1)。如果字串長度為n,那麼第一次掃瞄的時間複雜度是o(n)。第二次掃瞄時,同樣o(1)能讀出-乙個字元出現的次數,所以時間複雜度仍然是o(n)。這樣算起來,總的時間複雜度是o(n)。同時,我們需要乙個包含256個字元的輔助陣列,它的大小是1k。由於這個陣列的大小是個常數,因此可以認為這種演算法的空間複雜度是o(1)。

**描述

//leetcode**

char firstuniqchar(char* s);

//遍歷字串,統計字元出現的次數(0表示a,25表示z)

char* str = s;

while(*str)

//再次遍歷字串,並從陣列中檢視字元出現的次數,第一次出現次數為1的就是第乙個只出現依次的字元

str = s;

while(*str)

return ' ';

}//官方**---這裡一共有256個字元,所以陣列下標使用字元ascii值即可

char firstnotrepea tingchar (char* pstring)

return ' \0';

}

劍指offer 第乙個只出現一次的字元

在乙個字串 1 字串長度 10000,全部由字母組成 中找到第乙個只出現一次的字元,並返回它的位置 我們遍歷這個字串,假設每個當前字元都是只出現一次的,我們分別向前和向後考察是否存在相同字元 向前考察 儲存乙個vector裡面存放所有已知的已經重複過的字元,如果當前字元跟這個vector裡面的字元相...

劍指offer 第乙個只出現一次的字元

在乙個字串 0 字串長度 10000,全部由字母組成 中找到第乙個只出現一次的字元,並返回它的位置,如果沒有則返回 1.將字串轉化成陣列,兩個迴圈,外層迴圈遍歷這個陣列i,內層迴圈也是從0 開始遍歷j,判斷i對應的元素和j對應的元素是否相等,相等的話就說明不是要求的位置,直接開始判斷下乙個元素i p...

劍指offer 第乙個只出現一次的字元

在乙個字串 0 字串長度 10000,全部由字母組成 中找到第乙個只出現一次的字元,並返回它的位置,如果沒有則返回 1 需要區分大小寫 我的思路 第一次遍歷string,用乙個map記錄每個字元出現的次數 第二次遍歷map,找到次數為1的字元 第三次遍歷string,找到該字元出現的位置。問題 ma...