1. 程式人生 > >劍指offer--54字元流中第一個不重複的字元

劍指offer--54字元流中第一個不重複的字元

請實現一個函式用來找出字元流中第一個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"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 '#';
    }
}