你表明該算法是緩慢的:它查找字符串中的每個字符,它基本上意味着對於每個字符,你花你的時間檢查字符串的兩倍!巨大的時間損失。
最好的天真O(n)解決方案基本上保持所有字符的順序插入(所以第一可以找到),並映射到他們的可變整數。當我們完成分析時,我們瀏覽所有條目並返回已註冊的第一個字符,其計數爲1。
對可以使用的字符沒有限制。並且AtomicInteger
可用於import java.util.concurrent.atomic.AtomicInteger
。
使用Java 8:
public static char findFirstNonRepChar(String string) {
Map<Integer,Long> characters = string.chars().boxed()
.collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting()));
return (char)(int)characters.entrySet().stream()
.filter(e -> e.getValue() == 1L)
.findFirst()
.map(Map.Entry::getKey)
.orElseThrow(() -> new RuntimeException("No unrepeated character"));
}
不支持Java 8當量:
public static char findFirstNonRepChar(String string) {
Map<Character, AtomicInteger> characters = new LinkedHashMap<>(); // preserves order of insertion.
for (int i = 0; i < string.length(); i++) {
char c = string.charAt(i);
AtomicInteger n = characters.get(c);
if (n == null) {
n = new AtomicInteger(0);
characters.put(c, n);
}
n.incrementAndGet();
}
for (Map.Entry<Character, AtomicInteger> entry: characters.entries()) {
if (entry.getValue().get() == 1) {
return entry.getKey();
}
}
throw new RuntimeException("No unrepeated character");
}
遍歷散列表來查看哪一個計數爲1 * first *。你的意思是遍歷字符串?因爲「first」和「no defined iteration order」(對於HashMap)不能很好地混合。 – Thilo
複雜性方面,我認爲這兩種算法都是O(n^2),因爲有兩個循環:每個字符一次,然後再次迭代字符串以查看它是否再次出現。 ('lastIndexOf'隱藏第二個循環) – Thilo
您沒有提供足夠的信息給我們。 d'和'D'是重複字符還是不同?此外,我最初採取「重複」作爲兩個相同的人物在彼此旁邊。你應該在你的帖子中說清楚。 – Hatefiend