面试题50(题目二):字符流中第一个不重复的字符

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;
    }
}

猜你喜欢

转载自www.cnblogs.com/guoyu1/p/12222455.html