劍指offer--54字元流中第一個不重複的字元
阿新 • • 發佈:2019-01-04
請實現一個函式用來找出字元流中第一個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"go"時,第一個只出現一次的字元是"g"。當從該字元流中讀出前六個字元“google"時,第一個只出現一次的字元是"l"。
輸出描述:
如果當前字元流沒有存在出現一次的字元,返回#字元。
這個題和之前有一道題很相似,不過這個題唯一的變換就是沒有給出最後的字串,所以我們無法遍歷他,為了解決這個問題,我們可以實現定義一個空的字串,往空字串追加,或者是定義一個stringbuffer,往後面追加。
核心的思想是,定義一個數組,出現一次的字元,陣列(用字元的ASCII表示當前字元在陣列中的位置)中加一,再出現一次,再加一,最後我們遍歷這個字串,從第一個字元開始遍歷,誰在陣列中對應的值是第一個是1,那麼這個字元就是我們要的,下面給出兩個不同的程式碼。
package JZoffertest; public class test54 { //Insert one char from stringstream int hash[]=new int[256]; String s=""; public void Insert(char ch) { s+=ch; hash[ch]++; } //return the first appearence once char in current stringstream public char FirstAppearingOnce() { for(int i=0;i<s.length();i++) { if(hash[s.charAt(i)]==1) { return s.charAt(i); } } return '#'; } }
public class Solution { //主要的思想是利用一個數組,而且陣列的下標就是該字元代表的整數 //Insert one char from stringstream int[] hashTable = new int[256];//因為這個字元是由8位組成,所以這兒陣列最大是256個 StringBuffer buffer = new StringBuffer(); public void Insert(char ch) { buffer.append(ch); if(hashTable[ch] == 0){ hashTable[ch] = 1; }else{ hashTable[ch] = hashTable[ch] + 1; } } //return the first appearence once char in current stringstream public char FirstAppearingOnce() { char[] temp = buffer.toString().toCharArray(); for(char ch: temp){ if(hashTable[ch] == 1){ return ch; } } return '#'; } }