算法的学习笔记—(牛客JZ50)

在这里插入图片描述

img

😀前言
在处理字符串时,寻找第一个只出现一次的字符是一项常见的任务。本文将探讨几种有效的解法,包括使用 HashMap 和位集(BitSet)。

🏠个人主页:尘觉主页

文章目录

  • 🥰第一个只出现一次的字符位置
    • 😇题目链接
    • 🤔题目描述
    • 💖解题思路
      • 方法一:使用 HashMap
      • 方法二:使用整型数组
      • 方法三:使用位集(BitSet)
    • 😄总结

🥰第一个只出现一次的字符位置

😇题目链接

牛客网

🤔题目描述

在一个字符串中找到第一个只出现一次的字符,并返回它的位置。字符串只包含 ASCII 码字符。

Input: abacc
Output: b

💖解题思路

方法一:使用 HashMap

最直观的方法是使用 HashMap 来统计每个字符的出现次数。具体步骤如下:

  1. 遍历字符串,将字符作为键,出现次数作为值存入 HashMap。
  2. 再次遍历字符串,查找第一个出现次数为 1 的字符,返回其位置。

示例代码如下:

public int FirstNotRepeatingChar(String str) {// 创建一个 HashMap,用于统计每个字符的出现次数Map<Character, Integer> countMap = new HashMap<>();// 遍历字符串,将字符作为键,出现次数作为值存入 HashMapfor (char c : str.toCharArray()) {countMap.put(c, countMap.getOrDefault(c, 0) + 1);}// 再次遍历字符串,查找第一个出现次数为 1 的字符for (int i = 0; i < str.length(); i++) {if (countMap.get(str.charAt(i)) == 1) {// 返回该字符的位置return i;}}// 如果没有找到,返回 -1return -1;
}

以上实现的空间复杂度还不是最优的。考虑到只需要找到只出现一次的字符,那么需要统计的次数信息只有 0,1,更大,使用两个比特位就能存储这些信息。

方法二:使用整型数组

考虑到 ASCII 码字符有限,可以使用长度为 128 的整型数组代替 HashMap,来记录每个字符的出现次数。实现方法与上面类似,但效率更高。

public int FirstNotRepeatingChar(String str) {// 创建一个长度为 128 的整型数组,用于统计字符出现次数int[] cnts = new int[128];// 遍历字符串,统计每个字符的出现次数for (int i = 0; i < str.length(); i++) {cnts[str.charAt(i)]++;}// 再次遍历字符串,查找第一个出现次数为 1 的字符for (int i = 0; i < str.length(); i++) {if (cnts[str.charAt(i)] == 1) {// 返回该字符的位置return i;}}// 如果没有找到,返回 -1return -1;
}

方法三:使用位集(BitSet)

为了进一步优化空间复杂度,可以使用 BitSet 来存储每个字符的状态,分为三种情况:未出现(0)、出现一次(1)和出现多次(2)。通过两个 BitSet,可以高效地统计字符的出现情况。

public int FirstNotRepeatingChar2(String str) {// 创建两个 BitSet,用于记录字符的状态BitSet bs1 = new BitSet(128); // 用于记录字符出现一次BitSet bs2 = new BitSet(128); // 用于记录字符出现多次// 遍历字符串,更新字符的状态for (char c : str.toCharArray()) {if (!bs1.get(c) && !bs2.get(c)) {// 状态 0 -> 1(首次出现)bs1.set(c);} else if (bs1.get(c) && !bs2.get(c)) {// 状态 1 -> 2(再次出现)bs2.set(c);}}// 再次遍历字符串,查找第一个状态为 1 的字符for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);if (bs1.get(c) && !bs2.get(c)) { // 状态 1// 返回该字符的位置return i;}}// 如果没有找到,返回 -1return -1;
}

😄总结

本文介绍了三种方法来找到字符串中第一个只出现一次的字符。通过不同的数据结构和算法,解决方案的效率和空间复杂度各有不同。选择合适的方法取决于具体需求和数据规模。

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

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

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

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

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

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/57256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生命科学的前沿挑战与未来机遇

生命科学的前沿挑战与未来机遇 一、引言 21世纪被誉为生命科学的世纪&#xff0c;生命科学的迅猛发展为人类的健康、环境和社会经济带来了巨大的变革。从基因编辑技术的突破&#xff0c;到合成生物学的兴起&#xff0c;再到生物医药的快速进步&#xff0c;生命科学的前沿挑战…

Xmind一款极简思维导图和头脑风暴软件,支持PC和移动端,Xmind 2024.10.01101版本如何升级到Pro版?简单操作,最新可用!

文章目录 Xmind下载安装Xmind免费升级到Pro Xmind 是一款全功能的思维导图和头脑风暴软件&#xff0c;不限制节点和文件数&#xff0c;创新无限&#xff0c;界面纯净简洁无广告&#xff0c;支持PC和移动端&#xff0c;思维导图和大纲视图自由切换&#xff0c;可本地化文档存储&…

虚拟机数据恢复—通过拼接数据库页碎片的方式恢复数据库的数据恢复案例

虚拟机数据恢复环境&#xff1a; 某品牌服务器通过同品牌某型号的RAID卡&#xff0c;将4块STAT硬盘为一组RAID10阵列。上层部署XenServer虚拟化平台&#xff0c;虚拟机安装Windows Server系统&#xff0c;每台虚拟机有两个虚拟机磁盘&#xff08;系统盘 数据盘&#xff09;&am…

912.排序数组

目录 题目解法步骤 1&#xff1a;调用 randomized_partition步骤 2&#xff1a;递归调用 randomized_quicksort最终结果&#xff1a;变量变化总结&#xff1a; 为什么要把主元放到最后一个&#xff1f;partition返回得到的是什么下标&#xff1f; 题目 给你一个整数数组 nums&…

【数据管理】DAMA-数据资产目录

导读&#xff1a;数据资产目录作为企业级数据管理的核心组成部分&#xff0c;是连接数据生产者与数据消费者的桥梁&#xff0c;更是挖掘数据价值、提升决策效率的关键工具。以下是数据资产目录详细介绍。 目录 1、定义 2、功能和目标 2、目录例子 3、如何编制 一、明确目标…

安卓cpu知识

背景 目前的cpu都是多核的&#xff0c;为了有更好的能效&#xff0c;每个核的频率从低往高不等。市面上&#xff0c;大家根据频率不同&#xff0c;都叫大小核。既然分了大小核&#xff0c;那么多核心&#xff0c;就要有不同的cpu调度策略。所以cpu上的所有核&#xff0c;又会根…

jmeter 从多个固定字符串中随机取一个值的方法

1、先新增用户参数&#xff0c;将固定值设置为不同的变量 2、使用下面的函数&#xff0c;调用这写变量 ${__RandomFromMultipleVars(noticeType1|noticeType2|noticeType3|noticeType4|noticeType5)} 3、每次请求就是随机取的值了

中间件之Seata

一、引言 在微服务架构日益盛行的今天&#xff0c;分布式事务成为了一个必须面对和解决的问题。传统的本地事务已经无法满足分布式环境下的数据一致性需求&#xff0c;因此分布式事务解决方案应运而生。Seata作为一款开源的分布式事务中间件&#xff0c;以其高性能、易用性和灵…

优化多表联表查询的常见方法归纳

目录 一、使用mybatis的嵌套查询 二、添加表冗余字段&#xff0c;减少联表查询需求 三、分表预处理&#xff0c;前端再匹配 一、使用mybatis的嵌套查询 【场景说明】 前端需要展示一张列表&#xff0c;其中的字段来源于多张表&#xff0c;如何进行查询优化&#xff1f; 【…

飞凌嵌入式FET527N-C核心板已适配OpenHarmony4.1

近期&#xff0c;飞凌嵌入式为FET527N-C核心板适配了OpenHarmony4.1系统——进一步提升了核心板的兼容性、稳定性和安全性。 OpenHarmony4.1在应用开发方面展现了全新的开放能力&#xff0c;以更加清晰的逻辑和场景化视角提供给开发者丰富的API接口&#xff0c;应用开发能力得…

让你的 IDEA 使用更流畅 | IDEA内存修改

随着idea使用越来越频繁&#xff0c;笔者最近发现使用过程中有时候会出现卡顿现象&#xff0c;例如&#xff0c;启动软件变慢&#xff0c;打开项目的速度变慢等&#xff1a; 因此如果各位朋友觉得最近也遇到了同样的困惑&#xff0c;不妨跟着笔者一起来设置IDEA的内存大小吧~ …

基于ECS和NAS搭建个人网盘

前言 在数字化时代&#xff0c;数据已成为我们生活中不可或缺的一部分。个人文件、照片、视频等数据的积累&#xff0c;使得我们需要一个安全、可靠且便捷的存储解决方案。传统的物理存储设备&#xff08;如硬盘、U盘&#xff09;虽然方便&#xff0c;但存在易丢失、损坏和数据…

登录前端笔记(二):vuex管理用户数据;跨域;axios封装;环境;请求响应拦截;权限;用户资料Vuex共享

一、Vuex登录流程之用户模块&#xff1a; 简言之&#xff1a;点击登录调用actions且得到token&#xff0c;把得到的token提交给mutations从而修改state里的数据。 原视频 &#xff08;1&#xff09;Vuex用户模块流程 组件页面里点击登录后&#xff0c;调用stores里的actions&…

Springboot实现自动装配

自动装配&#xff08;Auto-wiring&#xff09;是 Spring 框架中的一个重要特性&#xff0c;它是指 Spring 容器在创建和管理 Bean 时&#xff0c;能够自动识别并满足 Bean 之间的依赖关系&#xff0c;无需开发人员显式地在配置文件或代码中指定依赖注入的具体细节。以下是对自动…

09_实现reactive之代理 Set 和 Map

目录 创建代理建立响应式联系避免污染原始数据处理 forEachfor...ofvalues 与 keys 方法 Set 和 Map 都有特定的属性和方法来操作自身&#xff0c;因此需要单独处理。 创建代理 我们来看一段案例代码&#xff0c;体验一下和它们的独特之处&#xff0c;如下&#xff1a; const…

《使用Gin框架构建分布式应用》阅读笔记:p108-p126

《用Gin框架构建分布式应用》学习第8天&#xff0c;p108-p126总结&#xff0c;总计18页。 一、技术总结 1.Redis eviction policy (1)什么是 eviction policy? The eviction policy determines what happens when a database reaches its memory limit. (2)配置示例 在r…

将 Ubuntu 系统中的 **swap** 空间从 2GB 扩展到 16GB

要将 Ubuntu 系统中的 swap 空间从 2GB 扩展到 16GB&#xff0c;可以按照以下步骤操作&#xff1a; 1. 关闭现有 Swap 文件 首先需要禁用当前的 swap 文件&#xff0c;以便重新调整其大小。 sudo swapoff -a2. 删除旧的 Swap 文件 假设当前的 swap 文件位于 /swapfile&…

基于Multisim电子配料秤电路设计(含仿真和报告)

【全套资料.zip】电子配料秤电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 电子配料秤仿真功能: 准确测量物体重量&#xff0c;精确度0.1Kg使用两位数码管显示重量信息 使用拨码…

如何将两个同样大小的List组装成一个Map?

如果你有两个同样大小的列表&#xff0c;并且想要将它们组装成一个Map&#xff0c;其中第一个列表的元素作为key&#xff0c;第二个列表的元素作为value&#xff0c;你可以使用Java 8的流&#xff08;Stream&#xff09;API来实现这一操作。 // 假设这是你的两个同样大小的列表…

【C++刷题】力扣-#108-将有序数组转换为二叉搜索树

题目描述 给定一个升序排列的整数数组 nums&#xff0c;将其转换为一棵高度平衡的二叉搜索树&#xff08;BST&#xff09;。高度平衡的二叉搜索树定义为&#xff1a;一个二叉搜索树&#xff0c;其中左右两个子树的高度差不超过 1。 示例 示例 1 输入: nums [-10,-3,0,5,9] 输…