剑指offer—50_2.字符流中第一个不重复的字符—分析及代码(Java)

剑指offer——50_2.字符流中第一个不重复的字符——分析及代码[Java]

一、题目

题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"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。

三、其他

暂无。

猜你喜欢

转载自blog.csdn.net/zml66666/article/details/109267028