字符流中第一個不重複的字符
問題
題目描述
請實現一個函數用來找出字符流中第一個只出現一次的字符。例如,當從字符流中只讀出前兩個字符"go"時,第一個只出現一次的字符是"g"。當從該字符流中讀出前六個字符“google"時,第一個只出現一次的字符是"l"。
輸出描述:
如果當前字符流沒有存在出現一次的字符,返回#字符。
思路一:使用HashMap暴力法存儲所有字符
使用HashMap,
key
爲字符
,value
爲字符出現的次數
每次取的時候按照順序遍歷字符串,求取在Map中出先的次數
思路二:使用隊列存儲不重複元素
鏈接:https://www.nowcoder.com/questionTerminal/00de97733b8e4f97a3fb5c680ee10720?answerType=1&f=discussion來源:牛客網
字符出現順序的判斷(第一個字符):
這裏就是改進的關鍵之處了,容易發現,字符流中不重複的字符可能同時存在多個,我們只要把這些 “不重複字符” 保存起來就可以,而無需保存那些重複出現的字符,而爲了維護字符出現的順序,我們使用隊列(先進先出)這一結構,先出現的不重複字符先輸出:
- 入隊:獲取字符流中的一個字符時,當我們判斷它是不重複時,將它加入隊列;
- 輸出/出隊:注意,因爲隊列中存儲的 “不重複字符” 在一系列的流讀取操作後,隨時有可能改變狀態(變重複),所以,隊列中的字符不能直接輸出,要先進行一次重複判斷,如果發現隊頭字符已經重複了,就將它移出隊列並判斷新的隊頭,否則,輸出隊頭的值;
package C字符串;
import java.util.LinkedList;
import java.util.Queue;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/2/19 0019 20:00
*
* 請實現一個函數用來找出字符流中第一個只出現一次的字符。
* 例如,當從字符流中只讀出前兩個字符"go"時,第一個只出現一次的字符是"g"。當從該字符流中讀出前六個字符“google"時,第一個只出現一次的字符是"l"。
*/
public class Problem3 {
int[] charCnt = new int[128];//128中字符用盡
//字符流中不重複的字符可能存在多個
//我們只要把這些“不重複字符保存起來,而無須保存那些重複出現的字符“,
// 而爲了維護字符出現的順序,我們使用隊列(先進先出)這一結構,先出現的不重複字符先輸出
//
Queue<Character> queue = new LinkedList<>();
public static void main(String[] args) {
}
//Insert one char from stringstream
public void Insert(char ch)
{
if(charCnt[ch]++==0){
queue.add(ch);
}
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce()
{
Character CHAR = null;
char c =0;
while((CHAR= queue.peek())!=null){
c = CHAR.charValue();
if(charCnt[c]==1){//判斷是否脫單,沒脫單則輸出
return c;
}else{
queue.remove();//脫單則移除隊列
}
}
return '#';//隊列爲空返回#
}
}