題目:
在乙個字串(0<=字串長度<=10000,全部由字母組成)中找到第乙個只出現一次的字元,並返回它的位置, 如果沒有則返回 -1(需要區分大小寫).
分析:
其實主要還是hash,利用每個字母的ascii碼作hash來作為陣列的index。
首先,需要定義乙個長度為58的陣列來儲存每個字母出現的次數。58的理由如下:
因為區分大小寫,大寫a-z對應的ascii碼為65-90,小寫的a-z對應的ascii碼值為97-122,一共26*2=52個英文本母,大寫的z和小寫的a之間有91~96共6個位置的空缺,所以需要用乙個58長度的陣列來儲存每個字母出現的次數。而每個字母的index=int(word)-65,比如g=103-65=38,而陣列中具體記錄的內容是該字母出現的次數,最終遍歷一遍字串,找出第乙個陣列內容為1的字母就可以了,時間複雜度為o(n)
**:
int firstnotrepeatingchar
(string str)
;//動態生存期的元素初始化是隨機的,賦初值為0
for(int i=
0;ilength()
;i++
)for
(int i=
0;ilength()
;i++)}
return-1
;}
tips
陣列的宣告
陣列屬於自定義資料型別,因此在使用前首先要進行型別宣告。宣告乙個陣列型別,應該包括以下幾個方面。
(1)確定陣列的名稱
(2)確定陣列元素的型別
(3)確定陣列的結構(包括陣列維數,每一維的大小等)
陣列型別宣告的一版形式為:
陣列型別 識別符號【常量表示式1】【常量表示式2】
陣列中元素的型別是由"資料型別"給出,可以是整型、浮點型等基本型別,也可以是結構體、類等自定義型別。陣列名稱有「識別符號」表示。常量表示式1指定了陣列每一維的大小
例如:int a[10];
表示a為int型陣列,有10個元素:a[0]~a[9],可以用於存放有10個元素的整數序列。
本題通過分析可以確定陣列的長度為58,型別為int,因此可以直接採用int a[58]
宣告陣列
陣列的初始化
陣列初始化就是在宣告陣列時給部分或全部元素賦初值。當指定的初值個數小於陣列大小時,剩下的陣列元素會被賦予0值。若定義陣列時沒有指定任何乙個元素的初值,對於靜態生存期(static修飾)的陣列,每個元素仍然會被賦予0值;但對於動態生存期(幽冥區域性生存期物件,其誕生於宣告點,結束於宣告所在塊執行完畢之時)的陣列,每個元素的初值都是不確定的。
本題中宣告的陣列用於記錄每個字元在字串**現的次數,因此應設初值為0值,且宣告的陣列屬於動態生存期的陣列,因此應在宣告的同時進行初始化,即int a[58]=;
。
第乙個只出現一次的字元
題目 在乙個字串中找到第乙個只出現一次的字元。如輸入 abaccdeff,則輸 出b。分析 這道題是 2006年google的一道筆試題。看到這道題時,最直觀的想法是從頭開始掃瞄這個字串中的每個字元。當訪問 到某字元時拿這個字元和後面的每個字元相比較,如果在後面沒有發現重複的字 符,則該字元就是只出...
第乙個只出現一次的字元
題目 在乙個字串中找到第乙個只出現一次的字元,並輸出它在字串中的位置。如輸入 abaccdeff,則輸出 b 1。定義乙個256長度的陣列,乙個用來記錄字元出現的次數。然後在遍歷字元陣列,如果該字元出現了一次,輸出並結束,否則繼續。include using namespace std 在乙個字串中...
第乙個只出現一次的字元
1.問題描述 在字串中找出第乙個只出現一次的字元。例如輸入abaccdeff,則輸出 b。來自 劍指offer 2.分析 我們可以用乙個容器來存放 對應的字元和出現次數 雜湊表 這裡僅僅用陣列來簡單的模擬了一下 第一次掃瞄時將出現的次數存放在表中,第二次掃瞄時掃瞄到次數為1的字元並返回該字元即可。表...