【Java】 劍指offer(50-2) 字符流中第一個只出現一次的字符


本文參考自《劍指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.對於數據流、字符流等,需要定義數據容器來保存記錄。

    流和串的區別:

    1)串:字符串已經保存下來了,能夠讀取遍歷,因此在字符串中第一個只出現一次的字符中,只需要存下每個字符出現的個數,然后直接在字符串中遍歷;

    2)流:字符流沒有存下來,無法進行遍歷,因此在本題中,只能在數據容器哈希表中遍歷,而且哈希表中存放的是對應字符的位置,而不是個數。

  2.記得會用構造函數來初始化參數;

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

  4.分清楚:字符與ASCII碼的轉化,以及 字符形式的數字轉和整型數字間的轉化

	public static void main(String[] args) {
		//字符轉化為ASCII碼
		char ch_a = 'a';
		int code_a = (int)ch_a; // =ASCII碼97
		
		//ASCII碼轉化為字符
		char copyCh_a = (char) code_a;  // =ASCII碼97對應的字符'a'
		
		//字符形式數字轉化為整型
		char c1 = '2';
		int n1 = c1-'0';  //=2, 由'2'和'1'的ASCII碼相減得到
		
		//數字轉化為字符形式
		char copyC1 = (char)(n1+'0');  //='2' ,由'0'的ASCII碼加2得到'2'的ASCII碼
		System.out.println(5);
	}	

  

  

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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM