题目描述:
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是'g'。当从该字符流中读出前六个字"google"时,第一个只出现一次的字符是'l'。
分析:
字符只能一个一个从字符流中读出来,因此要定义一个容器来保存字符以及其在字符流中的位置。
为尽可能搞笑解决问题,要在O(1)时间内往数据容器中插入字符,及其对应的位置,因此这个数据容器可以用哈希表来实现,以字符的ASCII码作为哈希表的键值key,字符对应的位置作为哈希表的值value。
开始时,哈希表的值都初始化为-1,当读取到某个字符时,将位置存入value中,如果之前读取过该字符(即value>=0),将value赋值为-2,代表重复出现过。最后对哈希表遍历,在value>=0的键值对中找到最小的value,该value即为第一个只出现一次的字符,ASCII码为key的字符即为所求字符。
示例代码:
public class zifuliu_first_once {private static int[] occurence;private static int index = 0;private static void init_flag_arr() {occurence = new int[256];for (int i = 0; i < 256; i++) {occurence[i] = -1;}}private static void insert(char ch) {if (occurence[(int)ch] == -1) {occurence[(int)ch] = index;} else if (occurence[(int)ch] >= 0) {occurence[(int)ch] = -2;}index++;}private static char get_first_appear_once_char() {int min_index = Integer.MAX_VALUE;char ret = '*';for (int i = 0; i < 256; i++) {if (occurence[i] >= 0 && occurence[i] < min_index) {min_index = occurence[i];ret = (char) i;}}return ret;}public static void main(String[] args) {init_flag_arr();insert('g');insert('o');System.out.println(get_first_appear_once_char());insert('o');insert('g');insert('l');insert('e');System.out.println(get_first_appear_once_char());}
}