字符流中第一個不重複的字符

字符流中第一個不重複的字符

問題

題目描述

請實現一個函數用來找出字符流中第一個只出現一次的字符。例如,當從字符流中只讀出前兩個字符"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 '#';//隊列爲空返回#

    }


}

發佈了155 篇原創文章 · 獲贊 18 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章