Nowcoder java-字符流中第一个不重复的字符

Nowcoder java-字符流中第一个不重复的字符

(题目来自牛客网)
在这里插入图片描述

思路

方法一:队列
将进来的字符存入到队列中,进来一次,就对相应坐标加一,统计出出现次数
队列特点,先进先出,拿到的是第一个次数为1的ch

方法二:用HashMap
利用<key,value>,key存储长,value存储次数,最后拿到key为1 的长即可。

代码

//import java.util.LinkedList;
//方法一 : 队列
//public class FirstAppearingOnce {
//    //英文字符不会逃出128个ascii码的范围,所以定义这个长度的数组
//    //第一个ASCII码是一个空字符,所以我都是相对于` `进行一一排列
//    //比如数字'0'是30,那'0'-''等于30,就存在tmp[30]这个地方即可
//    //注意,tmp存的是出现的子树,即'0'出现了两次,那么tmp[30]就是2
//    int[] tmp = new int[128];
//    //维护一个队列,只保存一次进来的元素,重复的丢掉
//    LinkedList<Character> queue = new LinkedList<>();
//
//    public void insert(char ch) {//第一次进来的元素放进队列尾部
//        if (tmp[ch - ' '] == 0) {
//            queue.add(ch);
//        }
//        tmp[ch - ' ']++;//进来一次,就对相应坐标加一,统计出出现次数
//
//    }
//
//    //取得时候是从队列得头部取,因为头部是比较早的数据
//    //出现次数大于等于2的话就不断丢弃,知道找到第一个出现次数为1的字符跳出循环
//    //return the first appearence once char in current stringstream
//    public char firstAppearingOnce() {
//        while (!queue.isEmpty() && tmp[queue.getFirst() - ' '] >= 2) {
//            queue.removeFirst();
//        }
//        if (!queue.isEmpty()) { //拿到这个第一个只出现一次的字符
//            return queue.getFirst();
//        }
//        return '#';//拿不到了,说明没有只出现一次的字符,那么就返回#
//    }
//}



import java.util.LinkedHashMap;
import java.util.Map;
//方法二: 用HashMap
public class FirstAppearingOnce {
    //用有序的Map:LinkedHashMap来存放char,并且记录其出现次数
    Map<Character, Integer> map = new LinkedHashMap<>();

    //Insert one char from stringstream
    public void insert(char ch) {
        if (!map.containsKey(ch)) {
            map.put(ch, 1);
        } else {
            map.put(ch, map.get(ch) + 1);
        }
    }

    //return the first appearence once char in current stringstream
    public char firstAppearingOnce() {
        for (char ch : map.keySet()) {// map.keySet()该方法返回map中所有key值的列表。
            int count = map.get(ch);
            //目前第一个只出现一次的字符
            if (count == 1) {
                return ch;
            }
        }
        return '#';
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值