在乙個字串(0<=字串長度<=10000,全部由字母組成)中找到第乙個只出現一次的字元,並返回它的位置, 如果沒有則返回 -1(需要區分大小寫).(從0開始計數)
示例1輸入 「google」
返回值 4
示例2……
一看這道題,馬上想到要用 hashmap 鍵值對,存放每乙個字元對應的值和索引,於是有了如下**:
可惜:失誤了,最怕的就是思路不正確,寫到一半發現,鍵值對也僅僅可以新增兩個值,且是無需的,那麼怎麼能過夠根據 map 找到對應的索引呢?那就每次把重複出現的資料移除,這樣出現次數是 1 的就是正確解果,結果還是錯,因為移除後,之前出現過的次數被清除為 0;// 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;
}
沒關係,通過遍歷 + contains 的方式,從前向後,如果除了這個字元, str 中還包含這個字元,那麼直接下乙個字元,直到 str 中不存在這個字元,於是有如下**
額……還是不行,怎麼能排除自身,取檢索呢?這樣通過包含檢測是不對的,不過可以用該字元將 str 分成兩半,分別用包含進行檢測;其實也是可行的private
intfirstnotrepeatingcharerror2
(string str)
}return-1
;}
修改後**如下:
實在覺得有簡單辦法,這麼簡單的題目耗時 1 個多小時……瞄了一眼解題,再次看到 [一葉浮沉] 的解題,其實瞄到了一眼//本次修改是在寫本部落格的時候突然想出來的
private
intfirstnotrepeatingchar
(string str)
}return-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 在乙個字串中...