算法的学习笔记—字符流中第一个不重复的字符(牛客JZ75)

news/2024/9/18 13:57:12/ 标签: 算法, 学习, 笔记, 数据结构, 牛客

img

😀前言
在编程面试和实际项目中,处理字符流并找到其中第一个不重复的字符是一个常见的挑战。本文将详细介绍如何利用 Java 来实现这一功能,并提供一个有效的解决方案。

🏠个人主页:尘觉主页

文章目录

  • 😀字符流中第一个不重复的字符
    • 😊问题描述
    • 🤔示例1
    • 🤔示例2
    • 🥰解题思路
    • 😁代码实现
      • 💝代码详解
      • 💝复杂度分析
    • 😄总结

😀字符流中第一个不重复的字符

牛客

😊问题描述

我们需要设计一个函数来处理字符流,目标是找到流中第一个只出现一次的字符。例如:

  • 当字符流中读到 “go” 时,第一个不重复的字符是 “g”。
  • 当读到 “google” 时,第一个不重复的字符变成了 “l”。

我们的任务是实现两个函数:

  • Insert(char ch):用于将字符插入到字符流中。
  • FirstAppearingOnce():返回字符流中第一个只出现一次的字符。如果没有,返回 #

string caseout = “”;

1.读入测试用例字符串casein

2.如果对应语言有Init()函数的话,执行Init() 函数

3.循环遍历字符串里的每一个字符ch {

Insert(ch);

caseout += FirstAppearingOnce()

}

\2. 输出caseout,进行比较。

🤔示例1

输入:“google”

返回值:“ggg#ll”

🤔示例2

输入:“abcdee”

返回值:“aaaaaa”

🥰解题思路

解决这个问题的一种有效方法是结合使用统计数组和队列来跟踪字符的出现次数和顺序。

  1. 统计字符出现次数
    由于字符都是 ASCII 码范围内的字符,我们可以使用一个大小为 128 的整型数组来记录每个字符出现的次数。通过将字符的 ASCII 码作为索引,可以快速地更新和查询每个字符的出现次数。
  2. 维护字符顺序
    使用队列来保存字符流中的字符顺序。每次插入新字符时,我们将其添加到队列中。同时,我们通过检查队列头部的字符来找出第一个出现一次的字符。如果队列头部的字符不再是只出现一次,我们就将其从队列中移除。
  3. 返回第一个不重复字符
    FirstAppearingOnce() 函数负责返回队列头部的字符。如果队列为空,则说明没有不重复的字符,返回 #

😁代码实现

import java.util.LinkedList;
import java.util.Queue;public class FirstUniqueCharInStream {// 数组用于记录每个字符的出现次数private int[] cnts = new int[128];// 队列用于维护字符的顺序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) {FirstUniqueCharInStream stream = new FirstUniqueCharInStream();String testString = "google";StringBuilder result = new StringBuilder();for (char ch : testString.toCharArray()) {stream.Insert(ch);result.append(stream.FirstAppearingOnce());}System.out.println(result.toString()); // 输出 "ggg#ll"}
}

💝代码详解

  1. cnts 数组:用于记录每个字符的出现次数。因为 ASCII 码范围是 0-127,所以我们使用一个大小为 128 的数组。
  2. queue 队列:用于保存字符的顺序,确保我们能快速找到第一个不重复的字符。
  3. Insert 函数:每次插入新字符时,更新 cnts 数组,并将字符添加到队列中。如果队列头部的字符不再唯一,则从队列中移除。
  4. FirstAppearingOnce 函数:返回队列头部的字符,或在队列为空时返回 #

💝复杂度分析

  • 时间复杂度:每次插入和查找操作的时间复杂度均为 O(1),因此整体时间复杂度为 O(n)。
  • 空间复杂度:我们使用了一个大小为 128 的数组和一个队列,空间复杂度为 O(n)。

😄总结

通过使用统计数组和队列的组合,我们能够高效地处理字符流并找到第一个不重复的字符。这种方法在字符流处理中表现优异,适用于需要实时处理数据流的场景。如果你在编码面试中遇到类似问题,不妨试试这个解决方案。

😁热门专栏推荐
学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img


http://www.ppmy.cn/news/1520319.html

相关文章

Transforms使用

文章目录 一、认识Transforms二、ToTensor方法使用三、展示图片的方法 一、认识Transforms transforms 是 torchvision 库中的一个模块&#xff0c;它提供了一系列的图像预处理功能。这些功能可以被用来对图像数据进行变换&#xff0c;以便它们能够被神经网络模型更好地处理。…

vulhub xxe靶机攻击教程

使用御剑目录扫描工具测试一下&#xff0c;发现有robots.txt文件 访问robots.txt文件&#xff0c;这个文件通常放的是一个网站的目录 我们得到两个目录&#xff0c;试着访问一下 xxe目录下是一个登录页面&#xff0c;xxe/admin.php目录下也是一个登录页面 我们先在xxe页面进行…

Spring Cloud Eureka与Kubernetes的集成:服务发现的混合方案

Spring Cloud Eureka与Kubernetes的集成&#xff1a;服务发现的混合方案 引言 随着微服务架构的流行&#xff0c;服务发现&#xff08;Service Discovery&#xff09;已经成为构建分布式系统的关键组件之一。在分布式系统中&#xff0c;服务实例的数量和位置是动态变化的&…

计算机网络: 第一章 概述_1

文章目录 1. 因特网概述1.1 网络、互联网与因特网的区别与关系1.2 因特网简介1.2.1 因特网发展的三个阶段1.2.2 因特网的组成 2. 电路交换 分组交换 报文交换2.1 电路交换2.2 分组交换2.3 报文交换2.4 三种交换方式的对比 3. 计算机网络的定义和分类3.1 计算机网络的定义3.2 计…

数论——拓展欧几里德算法复习

最近也是在备战比赛&#xff0c;所以也是来小小的复习了一下以前学的东西 最重要的是第一道题&#xff01; 最重要的是第一道题&#xff01; 最重要的是第一道题&#xff01; 先放拓欧板子&#xff08;不懂怎么推出了就发在评论区或者私聊&#xff09; int exgcd(int a,i…

Docker 进阶构建:镜像与仓库管理

目录 三. docker镜像构建 1. docker镜像结构 2. 镜像运行的基本原理 3. 镜像获得方式 4. 镜像构建 5. Dockerfile实例 6. 镜像优化方案 6.1. 镜像优化策略 6.2. 镜像优化示例:缩减镜像层 6.3. 镜像优化示例:多阶段构建 6.4. 镜像优化示例:使用最精简镜像 四. docke…

渗透测试靶机----DC系列 DC-1

渗透测试靶机----DC系列 DC-1 开启靶机&#xff0c;依旧是登陆窗&#xff0c;平平无奇 扫描ip&#xff0c;扫描端口&#xff0c;服务等信息 可以看到这里存在80服务&#xff0c;访问看看 非常明显&#xff0c;这里存在一个Drupal 的cms 并且是一个登录框&#xff0c;思路打开 …

【日常记录-JS】HTML5中使用SVG元素

Author&#xff1a;赵志乾 Date&#xff1a;2024-08-28 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 简介 在HTML5中使用SVG元素主要涉及到将SVG代码直接嵌入HTML文档&#xff0c;或者通过HTML元素&#xff08;如<img>、<obj…

协同过滤推荐算法:个性化推荐的基石

在信息爆炸的时代&#xff0c;个性化推荐系统成为帮助用户在海量数据中发现感兴趣的内容的关键工具。协同过滤推荐算法&#xff08;Collaborative Filtering, CF&#xff09;作为推荐系统中最重要的技术之一&#xff0c;它通过分析用户之间的行为模式来提供个性化推荐。本文将深…

大二必做项目贪吃蛇超详解之下篇游戏核心逻辑实现

贪吃蛇系列文章 上篇win32库介绍中篇设计与分析下篇游戏主逻辑 可以在Gitee上获取贪吃蛇代码。 文章目录 贪吃蛇系列文章5. 核心逻辑实现分析5. 3 GameRun5. 3. 1 PrintScore5. 3. 2 CheckVK5. 3. 3 BuyNewNode5. 3. 4 NextIsFood5. 3. 4 EatFood5. 3. 5 NotFood5. 3. 6 Chec…

STM32F401使用float浮点运算崩溃的一个解决实例

今天使用STM32F401开发大彩的串口屏通信&#xff0c;串口使用USART1,DMA通信&#xff0c;系统是FreeRTOS。 使用大彩提供的hmi_driver&#xff0c;执行到SetTextFloat这个函数时崩溃 该函数原型&#xff1a; void SetTextFloat(uint16 screen_id,uint16 control_id,float va…

dinput8.dll错误应该如何修复呢?五种快速修复dinput8.dll错误的问题

dinput8.dll文件是DirectInput库的一部分&#xff0c;主要负责处理游戏控制器的输入&#xff0c;如键盘、鼠标和游戏手柄等。这个文件通常位于Windows系统的System32文件夹中&#xff0c;是许多游戏和应用程序正常运行所必需的组件。它通过提供一个统一的接口来管理不同类型的输…

持续集成与持续部署(CI/CD)的深入探讨

在现代软件开发中&#xff0c;持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;已成为不可或缺的实践。这些方法旨在加快软件交付的速度&#xff0c;同时提高软件的质量和稳定性。通过CI/CD&#xff0c;开发团队可以频繁地将代码更改集成到主分支&…

集成电路学习:什么是ARM先进精简指令集计算机

ARM&#xff1a;先进精简指令集计算机 ARM先进精简指令集计算机&#xff08;Advanced RISC Machine&#xff0c;简称ARM&#xff09;是一种基于精简指令集计算机&#xff08;RISC&#xff09;原则的计算机处理器架构&#xff0c;由英国的ARM公司开发。这种架构以其低功耗和高性…

C++STL~~list

文章目录 一、list的概念二、list的使用三、list的练习四、与vector的对比五、总结 一、list的概念 list 是一种容器&#xff0c;实现了双向链表结构 它具有以下特点&#xff1a; 动态大小&#xff0c;可按需增减元素数量。高效的插入和删除操作&#xff0c;在任意位置插入和…

抽象和接口

a.抽象&#xff08;abstract&#xff09; 1. 定义 a. 抽象类&#xff1a;在普通类里增加了抽象方法。 b. 抽象方法&#xff1a;没有具体的执行方法&#xff0c;没有方法体的方法。 2. 总结 a. 因为抽象方法没有方法体&#xff0c;无法执行&#xff0c;所以不能…

Hackme靶机通关攻略

1.首先注册用户&#xff0c;登录 2.登录后&#xff0c;显示让我们查找自己喜欢的书&#xff0c;我们直接单击search&#xff0c;会列出很多书 3.随便选择一本书进行查询&#xff0c;与此同时进行抓包 4.放到重放器中&#xff0c;将数据改为1*&#xff0c;将数据包另存为1.txt&a…

c++11的学习

1.初始化列表 在C98中&#xff0c;标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。 struct Fun {int x;int y; }; struct Date {Date(int _year, int _month, int _day):year( _year),month(_month),day(_day){}int year 2005;int month 01;int day …

Mac装机必备软件有哪些?苹果电脑实用软件推荐

刚刚入手MacBook或者苹果电脑需要安装哪些软件呢&#xff1f;越来越多的人使用 Mac&#xff0c;各种功能、各式各样的 Mac 软件也是五花八门。刚拿到 Mac 的小伙伴们可能会有点迷茫&#xff0c;今天就帮大家分类整理一些装机必备好用的 App&#xff0c;保证个个是神器&#xff…

区间的合并

区间合并的说明 业务中的区间合并是比较常见的需求&#xff0c;区间合并的核心有两点&#xff1a; 合并前排序&#xff0c;后面处理起来可以简单很多&#xff1b;两个区间合并&#xff0c;这是多个区间合并的基础。 完整代码 区间类 /*** 区间类&#xff08;left、right可…