1.题目

2.解法1:每次都遍历:
public class Solution {
// String str不赋初始值为null,str += ch, ch = 'h', 会变成nullh
private String str = "";
private int[] arr = new int[128];
//Insert one char from stringstream
public void Insert(char ch) {
str += ch;
arr[ch]++;
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce() {
for (int i = 0; i < str.length(); i++) {
if (arr[str.charAt(i)] == 1) {
return str.charAt(i);
}
}
return '#';
}
}
2.解法2(减少遍历次数,队列,先入先出)
字符流是动态变化的,每次都是往后插入一个元素,需要返回第一个出现1次的元素,那么需要队列来处理
import java.util.ArrayDeque;
public class Solution {
private ArrayDeque<Character> fArr = new ArrayDeque<>();
private int[] count = new int[128];
//Insert one char from stringstream
public void Insert(char ch) {
// 如果第一次出现就添加进去
if(count[ch]++ == 0) {
fArr.offer(ch);
}
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce() {
Character c;
while((c = fArr.peek()) != null) {
// 判断此字符的count是不是为1
if(count[c.charValue()] == 1) {
return c;
}
// 如果不为1,移除
fArr.poll();
}
return '#';
}
}
时间复杂度为O(n),空间复杂度为O(n)
本文介绍两种高效算法,用于从动态变化的字符流中查找首次仅出现一次的字符。第一种方法通过遍历字符串和使用字符计数数组实现;第二种方法利用队列的先进先出特性减少遍历次数,提升效率。文章详细解释了每种方法的实现细节及时间、空间复杂度。
269

被折叠的 条评论
为什么被折叠?



