本文參考自《劍指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
//題目:在字符串中找出第一個只出現一次的字符。如輸入"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.若是須要判斷多個字符是否在某個字符串中出現過,或者統計多個字符在某個字符串中出現的次數,能夠考慮基於數組建立一個簡單的哈希表,這樣能夠用很小的空間消耗換來時間效率的提高。