题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。
输出描述:
如果当前字符流没有存在出现一次的字符,返回#字符。
算法思路
(1)采用哈希的思想,对每个字符在原串中出现的位置进行哈希映射,如果哈希值为0,说明是第一次出现,如果不为0,则之前出现过,此字符非我们所要查找的,置为-1
(2)找到只出现一次,且最早出现的字符。
代码实现
public class Solution {
final static int num = 256;
int arr[] = new int[num];
int index = 1;
//Insert one char from stringstream
public void Insert(char ch)
{
if(arr[ch] == 0) //第一次出现,则存出现的顺序
arr[ch] = index;
else //非首次出现,此字符视为无效
arr[ch] = -1;
index++;
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce()
{
int tmp = num;
char result = '#';
for(int i = 0; i < num; i++){
if(arr[i] > 0 && tmp > arr[i]){ //arr[i]>0表示找到出现次数只为1的字符,tmp>arr[i]表示找到最早出现的字符,tmp为出现的顺序
tmp = arr[i];
result = (char)i;
}
}
return result;
}
}