1. 程式人生 > >【Java】 劍指offer(50-2) 字元流中第一個只出現一次的字元 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集

【Java】 劍指offer(50-2) 字元流中第一個只出現一次的字元 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集

本文參考自《劍指offer》一書,程式碼採用Java語言。

更多:《劍指Offer》Java實現合集  

題目 

  請實現一個函式用來找出字元流中第一個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"go"時,第一個只出現一次的字元是'g'。當從該字元流中讀出前六個字元"google"時,第一個只出現一次的字元是'l'。

思路

  字元只能一個一個從字元流中讀出來,因此要定義一個容器來儲存字元以及其在字元流中的位置。

  為儘可能搞笑解決問題,要在O(1)時間內往資料容器中插入字元,及其對應的位置,因此這個資料容器可以用雜湊表來實現,以字元的ASCII碼作為雜湊表的鍵值key,字元對應的位置作為雜湊表的值value。

  開始時,雜湊表的值都初始化為-1,當讀取到某個字元時,將位置存入value中,如果之前讀取過該字元(即value>=0),將value賦值為-2,代表重複出現過。最後對雜湊表遍歷,在value>=0的鍵值對中找到最小的value,該value即為第一個只出現一次的字元,ASCII碼為key的字元即為所求字元。

 

測試算例 

  1.功能測試(讀入一個字元;讀入多個字元;所有字元都唯一;所有字元重複)

  2.特殊測試(讀入0個字元)

Java程式碼

//題目:請實現一個函式用來找出字元流中第一個只出現一次的字元。例如,當從
//字元流中只讀出前兩個字元"go"時,第一個只出現一次的字元是'g'。當從該字
//符流中讀出前六個字元"google"時,第一個只出現一次的字元是'l'。

public class FirstCharacterInStream {
	private int index;
	private int[] occurence;
	
	public FirstCharacterInStream() {  //在建構函式中初始化成員變數
		index=0;
		occurence = new int[256];
		for(int i=0;i<256;i++) {
			occurence[i]=-1;
		}
	}
	
	public void insert(char ch) {
		if(occurence[(int)ch]==-1) {
			occurence[(int)ch]=index;   //第一次出現
		}else if(occurence[(int)ch]>=0) {
			occurence[(int)ch]=-2;   //已經出現過了
		}
		index++;
	}
	
	public char getFirst() {
		int minIndex=Integer.MAX_VALUE;  //最大的integer
		char ch='#';
		for(int i=0;i<256;i++) {
			if(occurence[i]>=0 && occurence[i]<minIndex) {
				ch = (char) i;
				minIndex=occurence[i];
			}
		}
		return ch;
	}
}

  

收穫

  1.對於資料流、字元流等,需要定義資料容器來儲存記錄。  

  2.記得會用建構函式來初始化引數;

  3.Integer.MAX_VALUE=2^31-1,是32位作業系統(4位元組)中最大的符號型整型常量。

  

更多:《劍指Offer》Java實現合集