演算法 找出第乙個只出現一次的字元

2021-10-22 17:18:15 字數 2492 閱讀 7907

在乙個字串(0<=字串長度<=10000,全部由字母組成)中找到第乙個只出現一次的字元,並返回它的位置, 如果沒有則返回 -1(需要區分大小寫).(從0開始計數)

示例1輸入 「google」

返回值 4

示例2……

一看這道題,馬上想到要用 hashmap 鍵值對,存放每乙個字元對應的值和索引,於是有了如下**:

// write code here

public

intfirstnotrepeatingcharerror

(string str)

else}if

(map.

isempty()

)return-1

;int minindex = integer.max_value;

setcharacters = map.

keyset()

; iterator

iterator = characters.

iterator()

;while

(iterator.

hasnext()

)return minindex;

}

可惜:失誤了,最怕的就是思路不正確,寫到一半發現,鍵值對也僅僅可以新增兩個值,且是無需的,那麼怎麼能過夠根據 map 找到對應的索引呢?那就每次把重複出現的資料移除,這樣出現次數是 1 的就是正確解果,結果還是錯,因為移除後,之前出現過的次數被清除為 0;

沒關係,通過遍歷 + contains 的方式,從前向後,如果除了這個字元, str 中還包含這個字元,那麼直接下乙個字元,直到 str 中不存在這個字元,於是有如下**

private

intfirstnotrepeatingcharerror2

(string str)

}return-1

;}

額……還是不行,怎麼能排除自身,取檢索呢?這樣通過包含檢測是不對的,不過可以用該字元將 str 分成兩半,分別用包含進行檢測;其實也是可行的

修改後**如下:

//本次修改是在寫本部落格的時候突然想出來的

private

intfirstnotrepeatingchar

(string str)

}return-1

;}

實在覺得有簡單辦法,這麼簡單的題目耗時 1 個多小時……瞄了一眼解題,再次看到 [一葉浮沉] 的解題,其實瞄到了一眼new int[256];趕緊關上了解題。

//……
有了思路就好辦,因為 256 、128、1024 這些數是有特殊意義的!ascii 碼中,字元一共 128 個,分別是十進位制的 0 - 127;那麼既然我們要記錄 字元、出現此處、出現索引,那麼正好 str.charat() 的結果正好是 char 型,可以作為陣列的索引,即,陣列中指定索引的值即索引對應的 char 的出現頻次!

於是有如下**:

private

intmfirstnotrepeatingchar

(string str)

int res = integer.max_value;

for(

int i =

0; i <

128; i++)if

(res != integer.max_value)

return res;

return-1

;}

真是巧妙地思路呢!不過也有利有弊,對於長度較短的字串,還是會遍歷很多次,不過可以接受!

看了看 解法,

其實和我的解法不太一樣,但是思路最關鍵!!直接引導我的解法!

public

intmfirstnotrepeatingchar2

(string str){if

(str == null || str.

length()

==0)return-1

;int

count =

newint

[256];

//用乙個類似hash的東西來儲存字元出現的次數,很方便

for(

int i =

0; i < str.

length()

; i++

) count[str.

charat

(i)]++;

//其實這個第二步應該也是ka我的地方,沒有在第一時間想到只要在遍歷一遍陣列並訪問hash記錄就可以了

for(

int i =

0; i < str.

length()

; i++)if

(count[str.

charat

(i)]==1

)return i;

return-1

;

最後,我要進大廠!加油奧里給!

演算法 第乙個只出現一次的字元

在乙個字串 0 字串長度 10000,全部由字母組成 中找到第乙個只出現一次的字元,並返回它的位置,如果沒有則返回 1 需要區分大小寫 思路一 暴力破解,直接迴圈找到只出現一次的,時間複雜度為o n 2 int flag 0 int index 1 for int i 0 i思路二 採用hashma...

第乙個只出現一次的字元

題目 在乙個字串中找到第乙個只出現一次的字元。如輸入 abaccdeff,則輸 出b。分析 這道題是 2006年google的一道筆試題。看到這道題時,最直觀的想法是從頭開始掃瞄這個字串中的每個字元。當訪問 到某字元時拿這個字元和後面的每個字元相比較,如果在後面沒有發現重複的字 符,則該字元就是只出...

第乙個只出現一次的字元

題目 在乙個字串中找到第乙個只出現一次的字元,並輸出它在字串中的位置。如輸入 abaccdeff,則輸出 b 1。定義乙個256長度的陣列,乙個用來記錄字元出現的次數。然後在遍歷字元陣列,如果該字元出現了一次,輸出並結束,否則繼續。include using namespace std 在乙個字串中...