逻辑超级简单的写法
字符流中第一个不重复的字符
http://www.nowcoder.com/questionTerminal/00de97733b8e4f97a3fb5c680ee10720
使用队列once存储只出现过一次的字符(这是一个可以删除指定元素的队列,而非严格意义上的队列),使用集合multi存储出现过多次的字符。
那么每次插入新字符时:
- 若队列once中含有此字符,那么将此字符从队列中删除,在集合multi中添加此字符
- 若集合multi中含有此字符,说明此字符已经出现了多次,不做任何操作
- 若队列once和集合multi中都不含有此字符,说明此字符之前未曾出现过,将此字符入队
那么第一个只出现一次的字符就是队列once的队头元素
import java.util.*;
public class Solution {
LinkedList<Character> once=new LinkedList<>();//存储只出现一次的字符,作为队列使用,与队列不同的是可以删除任意值
Set<Character> multi=new HashSet<>();//存储出现多次的字符
public void Insert(char ch)
{
if(once.contains(ch)){
multi.add(ch);
once.removeFirstOccurrence(ch);
//不可使用linkedlist的remove(ch),因为会默认匹配remove(index)方法
}
else if(!multi.contains(ch)){
once.addLast(ch);
}
}
public char FirstAppearingOnce()
{
return once.isEmpty()?'#':once.getFirst();
}
}解法缺点:once.removeFirstOccurrence()需要遍历once队列,效率较低
