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


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

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

題目 

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

思路

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

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

測試算例 

  1.功能測試(存在/不存在只出現一次的字符;全部都為只出現一次的字符)

  2.特殊測試(null)

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碼值。

  2.哈希表的時間復雜度為O(1),要求有較高的查找速度時,可以考慮使用哈希表(Java中可以使用HashMap)

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

 

 

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

  


免責聲明!

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



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