当前位置: 代码迷 >> 综合 >> 中:字符流中第一个不重复的字符
  详细解决方案

中:字符流中第一个不重复的字符

热度:50   发布时间:2024-02-08 23:12:12.0

题目描述

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。

解:

1.我们需要一个接收字符流的函数,然后还有一个处理的函数,那么我们需要变量用于数据传送。所以首先我们需要一个字符数组或者字符串,考虑到数组的定长,字符流的字数不确定,还是考虑字符串。

2.关于处理,显然最简单的就是根据“数组下标标记法”来做,即我们利用特定字符作为数组下标,数组的值作为出现次数,那么只需要O(n)就可以完成次数统计。但是本题的字符不确定,所以这个转换函数比较麻烦。但是Java中有比较方便的map,所以我们改用map来设计这个数据结构,key作为字符值,value作为出现次数。

3.统计最先出现的第一个不重复字符,两种方法,一个是将字符串转换为字符数组遍历,然后逐个访问map找出第一个value=1的字符,这种情况适合于字符串并不长,且第一个字符出现得早的情形,估计很多题目都是这种序列特点,所以我采用这一种。另一种是遍历map,这样比较稳定,只需要找出value=1的字符,利用String的index指标找出最小指标即可,但是缺点就在于整个map都得遍历完才能确定哪个字符出现得最早。

import java.util.*;public class Solution {private String order="";private Map<Character,Integer> word=new HashMap<>();//Insert one char from stringstreampublic void Insert(char ch){if(!word.keySet().contains(ch)){word.put(ch,1);}else{word.put(ch,word.get(ch)+1);}order += ch;}//return the first appearence once char in current stringstreampublic char FirstAppearingOnce(){char first='#';char[] array=order.toCharArray();for(char ch:array){if(word.get(ch) == 1){first=ch;break;}}return first;}
}

--end--

  相关解决方案