題目描述
在字符串中找出第一個只出現一次的字符。如輸入"abaccdeff",則輸出’b’。
解題思路
-
爲了解決這個問題,我們可以定義一個哈希表(外部空間),其鍵值(Key)是字符,而值(Value)是該字符出現的次數。
- 同時我們還需要從頭開始掃描字符串兩次:
(1)第一次掃描字符串時,每掃描到一個字符就在哈希表的對應項中把次數加1。(時間效率O(n))
(2)第二次掃描時,每掃描到一個字符就能從哈希表中得到該字符出現的次數。
- 同時我們還需要從頭開始掃描字符串兩次:
這樣第一個只出現一次的字符就是符合要求的輸出。(時間效率O(n))
算法圖解
參考代碼:
package offer;
/**
* 第一個只出現一次的字符
*/
public class Offer50 {
public static void main(String[] args) {
String s = "abaccdeff";
System.out.println(FirstNotRepeatingChar(s));
}
/**
* 1. 暴力法 不寫了 O(n^2)
* 2. hash O(1) O(n)
*
* @param str
* @return
*/
public static char FirstNotRepeatingChar(String str) {
if (str == " ") {
return ' ';
}
char[] array = str.toCharArray();
int size = 256;
// 藉助數組來模擬哈希表,只用1K的空間消耗
int[] hastTable = new int[size];
// 初始化數組
for (int i = 0; i < size; i++) {
hastTable[i] = 0;
}
for (int i = 0; i < array.length; i++) {
hastTable[array[i]]++;
}
for (int i = 0; i < array.length; i++) {
if (hastTable[array[i]] == 1) {
return array[i];
}
}
return ' ';
}
}
附錄
該題源碼在我的 ?Github 上面!