import java.util.*;
import java.util.stream.Stream;
/**
* 题目:请实现一个函数用来找出字符流中第一个只出现一次的字符。
* 例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。
* 当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
* 如果当前字符流没有存在出现一次的字符,返回#字符。
* 思考一:
* 1)一个字符占8bit,ASCII码表中的字符256个,但只有128个可见,首先创建128大小的数组用于计数;
* 2)将每个输入的字符append到一个StringBuilder上,同时计数数组对应位置加1;
* 3)将StringBuilder转换成char数组开始遍历,当遍历到第一个计数为1的字符,返回该字符。
* 思路二:HashMap+ArrayList解决
* @author hexiaoli
*/
public class Main {
static HashMap<Character, Integer> map = new HashMap();
static ArrayList<Character> list = new ArrayList<Character>();
//Insert one char from stringstream
public static void Insert(char ch)
{
if(map.containsKey(ch)){
map.put(ch,map.get(ch)+1);
}else{
map.put(ch,1);
}
list.add(ch);
}
//return the first appearence once char in current stringstream
public static char FirstAppearingOnce()
{char c='#';
for(char key : list){
if(map.get(key)==1){
c=key;
break;
}
}
return c;
}
// 一个字符占8bit,ASCII码表中的字符256个,但只有128可见,创建128大小的数组
static int[] hashTable = new int[128];
static StringBuilder sb = new StringBuilder();
public static void Insert1(char ch) {
// 将每个输入的字符append到StringBuilder上
sb.append(ch);
hashTable[ch]++;
}
public static char FirstAppearingOnce1() {
// 将StringBuilder转换成char数组
char[] str = sb.toString().toCharArray();
for (char c : str) {
// 当遍历到第一个计数为1的字符,返回该字符
if (hashTable[c] == 1) {
return c;
}
}
return '#';
}
public static void main(String[] args) {
String str = "google";
for (int i = 0; i < str.length(); i++) {
//Insert1(str.charAt(i));
Insert1(str.charAt(i));
}
//System.out.println(FirstAppearingOnce1());
System.out.println(FirstAppearingOnce1());
}
}