📅  最后修改于: 2023-12-03 14:49:24.026000             🧑  作者: Mango
在许多情况下,我们需要在字符流中查找第一个非重复的字符。这是一个常见的编程问题,许多公司的面试中也会出现这样的问题。本文将介绍如何解决这个问题。
假设有一个字符流(即输入字符的序列),我们需要找到第一个非重复的字符,即在字符流中只出现一次的字符。
例如:
当前已经从字符流中读取了如下内容 “google”,第一个非重复的字符是‘g’。
如果字符流中没有非重复的字符,则返回空字符 '\0'。
为了解决这个问题,我们可以使用一个哈希表(HashMap)来记录每个字符出现的次数。我们遍历字符流中的每个字符,并将其加入哈希表中。对于已经在哈希表中出现过的字符,我们可以将其出现次数加 1。当我们找到第一个出现次数为 1 的字符时,就可以返回该字符。
以下是Java实现代码:
import java.util.HashMap;
import java.util.Map;
public class Solution {
private Map<Character, Integer> map = new HashMap<>();
private StringBuffer sb = new StringBuffer();
public void Insert(char ch) {
sb.append(ch); // 将字符添加到字符流中
if (map.containsKey(ch)) {
map.put(ch, map.get(ch) + 1); // 哈希表中已存在该字符,则出现次数+1
} else {
map.put(ch, 1); // 哈希表中不存在该字符,则将其出现次数设置为1
}
}
public char FirstAppearingOnce() {
for (int i = 0; i < sb.length(); i++) { // 遍历字符流中每一个字符
if (map.get(sb.charAt(i)) == 1) { // 找到第一个出现次数为1的字符
return sb.charAt(i);
}
}
return '\0'; // 如果没有找到,则返回空字符
}
}
该解决方案的时间复杂度为 O(n),其中 n 为字符流的长度。这是因为我们遍历字符流中的每一个字符,并将其添加到哈希表中。假设字符的种类数为 m(即字符集的大小),则哈希表的大小为 O(m),因此空间复杂度也为 O(m)。
本文介绍了如何从字符流中找到第一个非重复的字符。我们使用哈希表来记录字符出现的次数,并遍历字符流中的每一个字符。该算法时间复杂度为 O(n),空间复杂度为 O(m)。