第一個只出現一次的字元(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,那麼這兩個字串就互為變位詞。