CS-Notes/docs/notes/41.2 字符流中第一个不重复的字符.md

39 lines
1.5 KiB
Java
Raw Normal View History

2019-11-02 12:07:41 +08:00
# 41.2 字符流中第一个不重复的字符
2020-11-04 02:02:10 +08:00
## 题目描述
[牛客网](https://www.nowcoder.com/practice/00de97733b8e4f97a3fb5c680ee10720?tpId=13&tqId=11207&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github)
2019-11-02 12:07:41 +08:00
## 题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符例如当从字符流中只读出前两个字符 "go" 第一个只出现一次的字符是 "g"当从该字符流中读出前六个字符google" 时,第一个只出现一次的字符是 "l"
## 解题思路
2020-11-04 02:02:10 +08:00
使用统计数组来统计每个字符出现的次数本题涉及到的字符为都为 ASCII 因此使用一个大小为 128 的整型数组就能完成次数统计任务
使用队列来存储到达的字符并在每次有新的字符从字符流到达时移除队列头部那些出现次数不再是一次的元素因为队列是先进先出顺序因此队列头部的元素为第一次只出现一次的字符
2019-11-02 12:07:41 +08:00
```java
2020-11-04 02:02:10 +08:00
private int[] cnts = new int[128];
2019-11-02 12:07:41 +08:00
private Queue<Character> queue = new LinkedList<>();
public void Insert(char ch) {
cnts[ch]++;
queue.add(ch);
while (!queue.isEmpty() && cnts[queue.peek()] > 1)
queue.poll();
}
public char FirstAppearingOnce() {
return queue.isEmpty() ? '#' : queue.peek();
}
```
2019-11-02 14:39:13 +08:00
2019-11-02 17:33:10 +08:00
<div align="center"><img width="320px" src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/githubio/公众号二维码-2.png"></img></div>