0
点赞
收藏
分享

微信扫一扫

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


题目描述

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

解题思路

如果要在一次循环统计某个字符出现的次数,想到的是通过Map;
同时要记录插入顺序,想到的是LinkedHashMap

因此,通过LinkedHashMap来实现

代码

Map<Character,Integer> map = new LinkedHashMap<>();
//Insert one char from stringstream
public void Insert(char ch)
{
Integer oldvalue = map.put(ch,1);
if(oldvalue!= null) map.put(ch,oldvalue +1);
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce()
{
for (Map.Entry<Character, Integer> e :map.entrySet()){
if(e.getValue() == 1) {
return e.getKey();
}
}
return '#';
}

在这里贴出另外一种通过位图实现的代码:

list = new ArrayList<>();//仅用来记录字符的顺序
int [] map = new int[127];//标准ASCII码最大值是127

//Insert one char from stringstream
public void Insert(char ch)
{
int cint = ch - '\0';//第一个字符转义后为: \0
map[cint]++;
if(map[cint] == 1)
list.add(cint);
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce()
{
for (Integer i : list){
if(map[i] == 1)
return (char)i.intValue();
}
return '#';
}


举报

相关推荐

0 条评论