题目
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
思路解析
利用一个数组,然后数组的下标就是这个字符对应的整数。刚输入一个字符,先把这个字符放入一个队列。就将判断该字符对应下标在数组中的值是否已经有,有就在基础上加一,如果没有,则直接置为1。之后遍历数组中当前字符对应下标的元素值,如果元素值大于1,则将队头元素出队,一直执行这个过程知道当前字符对应下标的元素值小于等于1为止,此时,队头的元素就是字符流中第一不重复的字符。
源代码
package Arithmetic;
import java.util.LinkedList;
import java.util.Queue;
public class FirstAppearChar {
private int[] cnts = new int[256];//用来保存每个字符出现的次数
private Queue<Character> queue = new LinkedList<>();//保存遍历的字符
public void Insert(char ch) {
cnts[ch]++;
queue.add(ch);
while (!queue.isEmpty() && cnts[queue.peek()] > 1)
queue.poll();
}
//返回队头元素
public char FirstAppearingOnce() {
return queue.isEmpty() ? '#' : queue.peek();
}
public static void main(String[] args) {
FirstAppearChar firstAppearChar = new FirstAppearChar();
String string = "google";
char[] chars = string.toCharArray();
String res = "";
for (int i = 0; i < chars.length; i++) {
firstAppearChar.Insert(chars[i]);
res += chars[i];
System.out.println("字符流:"+res);//当前字符流
System.out.println(firstAppearChar.FirstAppearingOnce());
}
}
}