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

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

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

題目 

  在字符串中找出第一個只出現一次的字符。如輸入"abaccdeff",則輸出'b'。數組

思路

  建立哈希表,鍵值key爲字符,值value爲出現次數。第一遍掃描:對每一個掃描到的字符的次數加一;第二遍掃描:對每一個掃描到的字符經過哈希表查詢次數,第一個次數爲1的字符即爲符合要求的輸出。post

  因爲字符(char)是長度爲8的數據類型,共有256中可能,所以哈希表能夠用一個長度爲256的數組來代替,數組的下標至關於鍵值key,對應字符的ASCII碼值;數組的值至關於哈希表的值value,用於存放對應字符出現的次數。測試

測試算例 google

  1.功能測試(存在/不存在只出現一次的字符;所有都爲只出現一次的字符)url

  2.特殊測試(null)htm

Java代碼

//題目:在字符串中找出第一個只出現一次的字符。如輸入"abaccdeff",則輸出
//'b'。

public class FirstNotRepeatingChar {
	public char firstNotRepeatingChar(String str) {
		if(str==null)
			return '\0';
		int[] repetitions = new int[256];
		for(int i=0;i<256;i++)
			repetitions[i]=0;
		for(int i=0;i<str.length();i++) {
			int loc=(int) str.charAt(i);
			repetitions[loc]+=1;
		}
		for(int i=0;i<str.length();i++) {
			int loc=(int) str.charAt(i);
			if(repetitions[loc]==1)
				return (char)loc;
		}
		return '\0';
	}
	
	public static void main(String[] args) {
		FirstNotRepeatingChar demo =new FirstNotRepeatingChar();
		System.out.println((demo.firstNotRepeatingChar("google")=='l'));
		System.out.println((demo.firstNotRepeatingChar("aabccdbd")=='\0'));
		System.out.println((demo.firstNotRepeatingChar("$abcdefg")=='$'));
		System.out.println((demo.firstNotRepeatingChar(null)=='\0'));
	}
}

  

  

收穫

  1.若是須要建立哈希表,鍵值爲 字符,值爲 數字時,能夠考慮用數組(length=256)來替代,數組下標表示爲字符的ASCII碼值。blog

  2.哈希表的時間複雜度爲O(1),要求有較高的查找速度時,能夠考慮使用哈希表(Java中能夠使用HashMap)字符串

  3.若是須要判斷多個字符是否在某個字符串中出現過,或者統計多個字符在某個字符串中出現的次數,能夠考慮基於數組建立一個簡單的哈希表,這樣能夠用很小的空間消耗換來時間效率的提高。

 

 

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

相關文章
相關標籤/搜索