本文參考自《劍指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.如果需要判斷多個字符是否在某個字符串中出現過,或者統計多個字符在某個字符串中出現的次數,可以考慮基於數組創建一個簡單的哈希表,這樣可以用很小的空間消耗換來時間效率的提升。