找第一个只出现一次的字符_剑指offer 字符流中第一个只出现一次的字符
生活随笔
收集整理的這篇文章主要介紹了
找第一个只出现一次的字符_剑指offer 字符流中第一个只出现一次的字符
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述:
請實現一個函數用來找出字符流中第一個只出現一次的字符。例如,當從字符流中只讀出前兩個字符"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());} }歡迎關注,一起學習 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的找第一个只出现一次的字符_剑指offer 字符流中第一个只出现一次的字符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020年规划
- 下一篇: c 语言差错编码实验结果,C语言程序设计