剑指offer系列之五十三:字符流中第一个不重复的字符

题目描述

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。
输出描述:

如果当前字符流没有存在出现一次的字符,返回#字符。

这题与前面的第一个不重复的字符有些重复了,所以直接看代码(已被牛客AC):

package com.rhwayfun.offer;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class FistNoRepeatChar {

    //创建一个HashMap用于保存每个字符的次数
    private Map<Character, Integer> map = new HashMap<Character, Integer>();
    //创建一个List集合用于接收字符流中的字符
    private List<Character> list = new ArrayList<Character>();

    //从字符流中插入字符到集合和Map中
    public void Insert(char ch) {
        if(!map.containsKey(ch)){
            map.put(ch, 1);
            list.add(ch);
        }else{
            map.put(ch, map.get(ch) + 1);
            if(list.contains(ch)){
                list.remove(Character.valueOf(ch));
            }
        }
    }

    //得到第一个只出现一次的字符
    public char FirstAppearingOnce() {
        if(list.isEmpty()) return '#';
        return list.get(0);
    }
}
时间: 2024-09-15 04:14:53

剑指offer系列之五十三:字符流中第一个不重复的字符的相关文章

剑指offer系列之十三:链表中的倒数第k个节点

题目描述 输入一个链表,输出该链表中倒数第k个结点. 举一个简单的例子,比如链表{1,2,3,4,5},如果要返回倒数第二个节点,也就是k=2,就相当于正数第5-k+1=4个节点,所以我们可以采用两次循环:一次循环得到链表的结点个数:另一次循环则是从链表中找到第n-k+1个节点.虽然是两次循环,但时间复杂度是O(n),需要注意的是,这里仍然需要对链表的边界条件进行判断.基于这种思路写出如下代码: public ListNode FindKthToTail(ListNode head,int k)

剑指offer系列之三十三:第一个只出现一次的字符

题目描述 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置.若为空串,返回-1.位置索引从0开始 第一个只出现一次的字符是关键,就意味着需要所有的字符进行出现次数的统计,所以我们需要两次遍历:第一次获取每个字符出现的次数:第二次把第一个只出现一次的字符找到.在Java中可以通过HashMap实现对每个字符次数的统计,由于在题目中并没有我们限定使用Java提供的内置结构,所以可以通过这种办法迅速找到第一个只出现一次的字符. 下面是基于这种思路的实现

剑指offer系列之五十一:正则表达式匹配

题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式.例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配 由于只涉及两种正则表达式的匹配,所以关键是需要分清除匹配的所有情况,对于模式串来讲,出现了'.'和'*

剑指offer系列之五十二:表示数值的字符串

题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值. 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是. 这题与前面吧字符串转为数值有些类似,但是这里是判断

剑指offer系列之五十四:按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 此题明显是层序遍历的思路.由于需要按照之字形打印每一层,相当于在打印每一行之前需要判断上一行打印的顺序.比如,如果上一行打印的顺序使从左到右,那么下一行的打印顺序应该是从右到左.实现的这点可以采用奇数行从左到右打印,偶数行从右到左进行打印.还可直接设置 一个布尔变量,每打印一行就改变一次该变量的值.其他的就是层序遍历的思路了.下面是我实现的代

剑指offer系列之五:用两个栈实现队列

题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 栈的特点是先进后出,而队列的特点是先进先出.题目中提到使用两个栈实现队列,好像有戏.现在问题是如何把栈的出栈和入栈与队列的入队和出队联系起来?因为现在只有栈,所以在实现的队列中,只能先往栈中添加元素,这点比较好理解:那么出队呢,由于先进去的元素被压在栈底,而如果是队列的话,必须是栈底的那个元素先出队.现在可以使用第二个栈,思路是把原先第一个栈中的元素出栈,并压入第二个栈中,观察第二个栈,就可以发现:在

剑指offer系列之五十五:把二叉树打印成多行

题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 此题实际上与上面一题是重复了,总体还是层序遍历的思路,只不过现在不需要在打印每一行之前对打印顺序进行判断了,所以可以在前面一题的代码进行简单的修改就可以实现题目的要求了.不多说,直接看代码(已被牛客AC): package com.rhwayfun.offer; import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue;

剑指offer系列之四十三:扑克牌顺子

题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)-他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!"红心A,黑桃3,小王,大王,方片5","Oh My God!"不是顺子-..LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13.上面的5张牌就可以变成"1,2,3,4,5"(大小王

剑指offer系列之六十三:滑动窗口的最大值

题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}: 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,