一、题目
题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
输出描述:
如果当前字符流没有存在出现一次的字符,返回#字符。
二、分析及代码
1. 哈希表
(1)思路
本题可通过和第 50 题相同的思路解决,输入字符流的过程中,在 O(1) 时间复杂度内判断该字符是否已出现并记录,从而使整体复杂度控制在 O(n)。
这一思路结合哈希表能够实现,并有 2 点可优化:
1)字母个数是有限的,且可结合其 ASCII 码直接转化为连续的数字,因此通过一个数组即可实现哈希表的功能;
2)如果在哈希表中记录的是字符出现的个数,需通过再次遍历获得字符的位置,因此可直接记录字符出现的位置并将重复出现了的字符区分开,例如,将第一次出现的字符记录其位置,重复出现的记为 -2,从而在一次遍历过程中获取所需答案。
(2)代码
public class Solution {
int[] chars = new int[128];
int index = 1;
//Insert one char from stringstream
public void Insert(char ch)
{
if (chars[ch] == 0)
chars[ch] = index++;
else
chars[ch] = -1;
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce()
{
int index = 0;
char ans = '#';
for (int i = 0; i < 128; i++)
if (chars[i] > 0 && (index == 0 || index > chars[i])) {
index = chars[i];
ans = (char)i;
}
return ans;
}
}
(3)结果
运行时间:12 ms,占用内存:9552 k。
三、其他
暂无。