題目:在乙個字串中找到第乙個只出現一次的字元。如輸入abaccdeff,則輸出b。
分析:這道題是2023年google的一道筆試題。
方法一:
最直觀的想法是從頭開始掃瞄這個字串中的每個字元。當訪問到某字元時拿這個字元和後面的每個字元相比較,如果在後面沒有發現重複的字元,則該字元就是只出現一次的字元。如果字串有n個字元,每個字元可能與後面的o(n)個字元相比較,因此這種思路時間複雜度是o(n2)。
char findonce(char * str)
if (str[j] == '\0' )
return str[i];
}return '\0' ;
}
方法二:
我們試著去找乙個更快的方法。由於題目與字元出現的次數相關,我們是不是可以統計每個字元在該字串中出現的次數?要達到這個目的,我們需要乙個資料容器來存放每個字元的出現次數。在這個資料容器中可以根據字元來查詢它出現的次數,也就是說這個容器的作用是把乙個字元對映成乙個數字。在常用的資料容器中,雜湊表正是這個用途。
由於字元(char)是乙個長度為8的資料型別,因此總共有可能256 種可能。於是我們建立乙個長度為256的陣列,每個字母根據其ascii碼值作為陣列的下標對應陣列的對應項,而陣列中儲存的是每個字元對應的次數。這樣我們就建立了乙個大小為256,以字元ascii碼為鍵值的雜湊表。(256個字元我們建立乙個256個陣列,陣列用來存放字元的次數,使用字元的ascii值作為陣列的下標)
我們第一遍掃瞄這個陣列時,每碰到乙個字元,在雜湊表中找到對應的項並把出現的次數增加一次。這樣在進行第二次掃瞄時,就能直接從雜湊表中得到每個字元出現的次數了。
char firstnotrepeatingchar(char* pstring)
// if the string is empty
return '\0';
}
第一次只出現一次的字元
include include includechar firstnotrepeatingchar char pstring if pstring null return 0 const int tablesize 256 unsigned int hashtable tablesize for u...
第一次只出現一次的字元
在字串中找出第乙個只出現一次的字元。如輸 abaccdeff 則輸出 b include string include map include iostream using namespace std 法1 用map o nlogn char firstnotrepeatedchar0 char s...
第一次只出現一次的字元
題目劍指offer50 第一次只出現一次的字元 在乙個字串 0 字串長度 10000,全部由字母組成 中找到第乙個只出現一次的字元,並返回它的位置,如果沒有則返回 1 需要區分大小寫 總結 方法一 基於linkedhashmap的方法 由於題目與字元出現的次數有關,所以可以想到用乙個容器統計每個字元...