字符流中第一个不重复的字符

题目
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
思路解析
利用一个数组,然后数组的下标就是这个字符对应的整数。刚输入一个字符,先把这个字符放入一个队列。就将判断该字符对应下标在数组中的值是否已经有,有就在基础上加一,如果没有,则直接置为1。之后遍历数组中当前字符对应下标的元素值,如果元素值大于1,则将队头元素出队,一直执行这个过程知道当前字符对应下标的元素值小于等于1为止,此时,队头的元素就是字符流中第一不重复的字符。
源代码

package Arithmetic;

import java.util.LinkedList;
import java.util.Queue;

public class FirstAppearChar {
    private int[] cnts = new int[256];//用来保存每个字符出现的次数
    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();
    }

    public static void main(String[] args) {
        FirstAppearChar firstAppearChar = new FirstAppearChar();
        String string = "google";
        char[] chars = string.toCharArray();
        String res = "";
        for (int i = 0; i < chars.length; i++) {
            firstAppearChar.Insert(chars[i]);
            res += chars[i];
            System.out.println("字符流:"+res);//当前字符流
            System.out.println(firstAppearChar.FirstAppearingOnce());
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值