《剑指offer》-找出字符流中第一个只出现一次的字符

/*
 * 请实现一个函数用来找出字符流中第一个只出现一次的字符。
 * 例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。
 * 当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
 * 如果当前字符流没有存在出现一次的字符,返回#字符。
 */
import java.util.*;
public class FirstAppearingOnce {
	//Insert one char from stringstream
	StringBuffer sb = new StringBuffer();
	
    public void insert(char ch) {
        sb.append(ch);
        //System.out.println(sb);
    }
    
    //return the first appearence once char in current stringstream
    //暴力搜索,算法复杂度:O(n^2)
    public char firstAppearingOnce() {
    	if(sb.length() == 1)	return sb.charAt(0);
    	
    	List<String> list = new ArrayList<String>();
    	char c = 0;  	
    	for(int i = 0;i < sb.length();i ++) {
    		if(!list.contains(sb.charAt(i) + "")) {
	    		int count = 0;
				list.add(sb.charAt(i) + "");	//存放非重复字符列表
	    		for(int j = i;j < sb.length();j ++) {
	    			if(sb.charAt(j) == sb.charAt(i)) {
	    				count ++;
	    			}
	    		}
	    		
	    		if(count == 1) {
	    			c = sb.charAt(i);
	    			break;
	    		}
    		}		
    	}
    	
    	if(c == 0)	return '#';
    	return c;
    }

    //一个字符占8位,每一个字符对应一个数值,数值范围是0-255,最多不超过256种(实际上是一个哈希表)
  	StringBuffer sb2 = new StringBuffer();
  	int[] charArray = new int[256];
    public void insert2(char ch) {
    	sb.append(ch);
        charArray[ch] ++;
    }
      
    //算法复杂度:O(n)
  	public char firstAppearingOnce2() {
  		char c = 0;
  		for(int i = 0;i < sb.length();i ++) {
  			if(charArray[sb.charAt(i)] == 1) {
  				return sb.charAt(i);
  			}
  		}
  		
  		return '#';
  	}
    public static void main(String[] args) {   
    	FirstAppearingOnce t = new FirstAppearingOnce();   	
    	t.insert('g');
    	t.insert('o');
    	t.insert('o');
    	t.insert('g');
    	//t.Insert('l');  	
		System.out.println(t.firstAppearingOnce());
	}
}

猜你喜欢

转载自blog.csdn.net/zhou15755387780/article/details/79352477