逻辑超级简单的写法

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

http://www.nowcoder.com/questionTerminal/00de97733b8e4f97a3fb5c680ee10720

使用队列once存储只出现过一次的字符(这是一个可以删除指定元素的队列,而非严格意义上的队列),使用集合multi存储出现过多次的字符。

那么每次插入新字符时:

  1. 若队列once中含有此字符,那么将此字符从队列中删除,在集合multi中添加此字符
  2. 若集合multi中含有此字符,说明此字符已经出现了多次,不做任何操作
  3. 若队列once和集合multi中都不含有此字符,说明此字符之前未曾出现过,将此字符入队

那么第一个只出现一次的字符就是队列once的队头元素

import java.util.*;
public class Solution {
    LinkedList<Character> once=new LinkedList<>();//存储只出现一次的字符,作为队列使用,与队列不同的是可以删除任意值
    Set<Character> multi=new HashSet<>();//存储出现多次的字符

    public void Insert(char ch)
    {
        if(once.contains(ch)){
            multi.add(ch);
            once.removeFirstOccurrence(ch);
            //不可使用linkedlist的remove(ch),因为会默认匹配remove(index)方法
        }
        else if(!multi.contains(ch)){
            once.addLast(ch);
        }
    }

    public char FirstAppearingOnce()
    {
        return once.isEmpty()?'#':once.getFirst();
    }
}

解法缺点:once.removeFirstOccurrence()需要遍历once队列,效率较低

全部评论

相关推荐

10-02 19:29
已编辑
浙江科技大学 运营
点赞 评论 收藏
分享
10-22 15:25
门头沟学院 C++
种花网友小松:求求你别发了,我几乎都快嫉妒得疯了,倒在床上蒙住被子就开始抱着枕头尖叫流泪,嘴里一边喊着卧槽卧槽,一边又忍着,我边发边哭,打字的手都是抖的,后来我的手抖得越来越厉害,从心头涌起的思想、情怀和梦想,这份歆羡和悔恨交织在一起,我的笑还挂在脸上,可是眼泪一下子就掉下来了。求你了别发了,我生活再难再穷我都不会觉得难过,只有你们发这种东西的时候,我的心里像被刀割一样的痛,打着字泪水就忍不住的往下流。
我的求职进度条
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务