如果你要尋找的是隻發生一次的信中第一次出現,我會用另一種數據結構來跟蹤多少次中的每個字母已被看到。這可以讓你用O(n)而不是O來解決這個問題,只是在這種情況下n是最小和最大字符代碼或字符串長度之間的差值中的較大者,而所以不能直接比較。
注意:這個使用的早期版本for-in
- 在實踐中結果是非常慢。我已經更新它以使用字符代碼作爲索引,以儘可能快地查找。我們真正需要的是一個散列表,但是考慮到N的小值和小的相對加速度,這個問題可能不值得。事實上,你應該更喜歡@ Guffa的解決方案。我只是因爲我最終從中學到了很多。
function firstNonRepeatedCharacter(string) {
var counts = {};
var i, minCode = 999999, maxCode = -1;
for (i = 0; i < string.length; ++i) {
var letter = string.charAt(i);
var letterCode = string.charCodeAt(i);
if (letterCode < minCode) {
minCode = letterCode;
}
if (letterCode > maxCode) {
maxCode = letterCode;
}
var count = counts[letterCode];
if (count) {
count.count = count.count + 1;
}
else {
counts[letterCode] = { letter: letter, count: 1, index: i };
}
}
var smallestIndex = string.length;
for (i = minCode; i <= maxCode; ++i) {
var count = counts[i];
if (count && count.count === 1 && count.index < smallestIndex) {
smallestIndex = count.index;
}
}
return smallestIndex < string.length ? string.charAt(smallestIndex) : '';
}
見小提琴在http://jsfiddle.net/b2dE4/
另外一個(除了評論略有不同)在http://jsperf.com/24793051/2
非重複字符的索引性能測試將是奇數,這將是比字符不同在它之前。這應該足以讓你通過。 – tvanfosson
我不明白,指數怎麼會很奇怪?在我的例子中,c在第三個索引中,但是如果它是aabbcd,那麼這意味着它將在第四個索引中。 – TaylorAllred
他認爲它必須重複之前的角色 – dave