📌  相关文章
📜  从字符流找到的第一个非重复的字符(1)

📅  最后修改于: 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)。