题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
返回值描述:
如果当前字符流没有存在出现一次的字符,返回#字符。
解题思路1:采用LinkerHashMap
代码设计:
import java.util.*;
public class Solution {
//Insert one char from stringstream
private String s="";//需要赋初值
public void Insert(char ch)
{
s+=ch;
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce()
{
int l=s.length();
if(l==0||s==null)
return '#';
//采用map
int i=0;
Map<Character,Integer> m=new LinkedHashMap();
//但是hashmap里面的元素是不按添加顺序的
//采用LinkedHashMap
for(;i<l;i++){
if(!m.containsKey(s.charAt(i)))
m.put(s.charAt(i),1);
else m.put(s.charAt(i),m.get(s.charAt(i))+1);
}
for(Map.Entry<Character,Integer>entry:m.entrySet()){
if(entry.getValue()==1)
return entry.getKey();
}
return '#';
}
}
解题思路:仿LinkedHashMap
public class Solution {
//Insert one char from stringstream\
private String s="";
private char []hash=new char[256];//数组保存出现的次数
public void Insert(char ch)
{
s+=ch;
hash[ch]++;//Ascii码表示
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce()
{
int l=s.length();
if(s==null||l==0)
return '#';
for(int i=0;i<l;i++){//还是按照顺序填充的
if(hash[s.charAt(i)]==1)
return s.charAt(i);
}
return '#';
}
}