- 题目:
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。如果当前字符流没有存在出现一次的字符,返回#字符。
- 思路:(和test34一样一样的,易错点也是一样的)易错点:找第一次出现的字符,如果用数组做的话,就得存储上一次出现1次的字符(或者看后面用map做的方法),然后比较,因为比如google,l的次数也是1,e的次数也是1,但是遍历数组下标的时候,是先遍历的e的次数,再遍历的l的次数。用map做的话,因为HashMap存储是无序的,得用个字符串,或者list把字符传入顺序记录下来,然后遍历字符串或者list,找第一个为1的。或者用LinkedHashMap做,因为它存储有序。
- 代码:
class Solution {
int[] a=new int[256];//建一个256的数组,初始值为0;
char lastch='#';//记录上一次 第一个出现一次的字符
//Insert one char from stringstream
public void Insert(char ch)
{
a[ch]++;
FirstAppearingOnce();
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce()
{
char realch='#';
for(int i=0;i<a.length;i++){//从前往后找到第一个为1的字符
if(a[i]==1){
realch=(char)i;
break;
}
}
//判断是上一个只出现一次的字符还是不是为1,是的话,还是返回上一个字符
if(a[lastch]==1){
realch=lastch;
}else{
lastch=realch;
}
return realch;
}
}