1、题目描述:
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
2、思路:
因为本题目字符是以流的形式输入的,也就是说字符动态的增加。为了找到第一个只出现一次的字符,可以将每次输入的字符保存在LinkedHashMap当中,然后遇到重复的字符,其value次数就+1。然后只要一次遍历key即可,这种解法的时间复杂度为O(n),空间复杂度为O(1)因为字符个数有限个,char是8位的,256个字符。
最终解法,自己实现哈希表,创建两个数组,一个数组存储的是字符的个数,另一个存储的是字符传入的顺序,即这是第几个插入的字符。因此只需要遍历出所有次数为一次的字符,找出传入顺序最小的那个。
3、代码:
public class Solution { int[] count = new int[256]; // 字符出现的次数 int[] index = new int[256]; // 字符出现的次数 int number = 0; public void Insert(char ch) { count[ch]++; index[ch] = number++; } public char FirstAppearingOnce() { int minIndex = number; char ch = '#'; for (int i = 0; i < 256; i++) { // !!! if (count[i] == 1 && index[i] < minIndex) { ch = (char) i; minIndex = index[i]; } } return ch; } }