项目地址:https://github.com/SpecialYy/Sword-Means-Offer
题目
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。
输出描述:
如果当前字符流没有存在出现一次的字符,返回#字符。
解析
预备知识
看到统计字符相关的题目,可以首选哈希表的思想,也就是说字符作为key,出现次数作为value,这样我们就可以牺牲空间换来O(1)的访问。一般适用于键值较少的情况,否则可能会超出内存限制。
因为哈希表的底层结构其实就是数组,键值对的key通过hash函数计算的结果在数组索引范围内进行寻址,也就是说通过哈希函数可以把key转化为数字,且数字范围为数组的大小。
又因为字符的ascii码就是整型数字且唯一表示字符,因此我们可以直接把字符直接作为数组索引,那么出现的次数就是数组中元素值。
思路一
有了预备知识对哈希表原理的解释,我们可以利用字符的特性,使用数组作为我们简单map容器。
我们申请一个2的15次方大的数组(因为Java中char用2个字节实现,其他语言的话可以自行选择)来作为map对字符的出现次数进行统计,然后申请一个字符串缓冲器StringBuilder来记录插入的字符,为了防止缓冲器容量爆炸,我们在