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