1. 程式人生 > >第一個只出現一次的字元(Java)

第一個只出現一次的字元(Java)

題目:

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

第一思路:藉助於陣列來做。

開闢一個長度為26的陣列,用來存放字串中每個字元出現的次數。這樣第一次掃描去統計這個字串中字元出現的次數,第二次去統計第一個出現結果為1的次數,並輸出對應的字元。

public class Main {
    //輸出0代表沒有滿足條件的
	public static char findFirstNoRepeatChar(String str){
		if(str == null || str.trim().length()==0){
			return '0';
		}
		int []counts = new int[26];
		str = str.toLowerCase(); //防止出現大小寫混亂的情況
		int len = str.length();
		for(int i = 0; i < len; i++){
			counts[str.charAt(i) - 'a']++;
		}
		for(int i = 0; i < len; i++){
			if(counts[str.charAt(i) - 'a'] == 1){
				return str.charAt(i);
			}
		}
		return '0';
	}
	
	public static void main(String[] args) {
		System.out.println(findFirstNoRepeatChar("abaccdeff"));
	}
}

小結:上面開闢的一個數組,其實就是為了讓a~z對應。故演化出來的第二種做法就是利用帶有<k,v>鍵值對的形式來解決問題。

第二思路:藉助於HashMap來做。

藉助於HashMap天然的集合優勢,<k,v>鍵值對的形式,k儲存字元,v儲存出現的次數。故藉此來找到第一個只出現一次的字元。

程式碼實現:

public class Main1 {

	public static char findFirstNoRepeatChar(String str){
		if(str == null || str.trim().length()==0){
			return '0';
		}
		Map<Character, Integer> map = new HashMap<Character, Integer>();
		str = str.toLowerCase(); //防止出現大小寫混亂
		int len = str.length();
		int count = 0;
		for(int i = 0; i < len; i++){
			if(map.containsKey(str.charAt(i))){
				count = map.get(str.charAt(i));
				map.put(str.charAt(i), ++count);
			}else{
				map.put(str.charAt(i), 1);
			}
		}
		for(int i = 0; i < len; i++){
			if(map.get(str.charAt(i)) == 1){
				return str.charAt(i);
			}
		}
		return '0';
	}
	
	public static void main(String[] args) {
		char c1 = findFirstNoRepeatChar("abaccdeff");
		System.out.println(c1);
	}
}

小結:條條大路通羅馬

相關題目一:

定義一個函式,輸入兩個字串,從第一個字串中刪除在第二個字串中出現過的所有字元。例如從第一個字串“We are students.”中刪除在第二個字串"aeiou"中出現過的字串得到的結果是"W r Stdnts."。

思路:

我們可以建立一個用陣列實現的簡單雜湊表來儲存第二個字串。這樣我們從頭到尾掃描第一個字串的每一個字元時,用O(1)時間就能判斷出該字元是不是在第二個字元中。如果第一個字串的長度是n,那麼總的時間複雜度是O(n)。

相關題目二:

定義一個函式,刪除字串中所有重複出現的字元。例如輸入"google",刪除重複的字串之後的結果是"gole"。

思路:

我們可以建立一個用布林型陣列實現的簡單的雜湊表。陣列中的元素的意義是其下表看作ASCII碼對應的字母在字串中是否已經出現。我們先把陣列中所有的元素都設為false。以google為例,當掃描到第一個g時,g的ASCII碼是103,那麼我們把陣列下標為103的元素設為true,就知道g在前面已經出現了。即我們用O(1)時間就能判斷出每個字元是否在前面已經出現過。如果是字串的長度是n,那麼總的時間複雜度是O(n)。

相關題目三:

在英語中,如果兩個單詞中出現的字母相同,並且每個字母出現的次數也相同,那麼這兩個單詞互為變位詞(Anagram)。例如silent與listen、evil與live等互為變位詞。完成一個函式,判斷輸入的兩個字串是不是互為變位詞。

思路:

我們可以建立一個用陣列實現的簡單雜湊表,用來統計字串中每個字元出現的次數。當掃描到第一個字串中的每個字元時,為雜湊表對應的項的值增加1。接下來掃面第二個字串,掃描到每個字串時,為哈西邊對應的項的值減去1。如果掃描完第二個字串後,雜湊表所有的值都是0,那麼這兩個字串就互為變位詞。