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

news2024/10/23 8:41:14

在这里插入图片描述

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<>();
    
    // 遍历字符串,将字符作为键,出现次数作为值存入 HashMap
    for (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;
        }
    }
    
    // 如果没有找到,返回 -1
    return -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;
        }
    }
    
    // 如果没有找到,返回 -1
    return -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;
        }
    }
    
    // 如果没有找到,返回 -1
    return -1;
}

😄总结

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

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

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

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

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

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

img

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

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

相关文章

软件分享丨豆包电脑端 AI 助手

豆包电脑端 AI 助手是由字节跳动推出&#xff0c;旨在为用户提供高效便捷的工作和学习体验。它能在工作、学习等场景中发挥重要作用&#xff0c;为用户提供智能辅助&#xff0c;下面简单介绍它的特点&#xff1a; 高效搜索&#xff1a;像优化后的百度&#xff0c;直接提问就能…

【本科毕业设计】基于单片机的智能家居防火防盗报警系统

基于单片机的智能家居防火防盗报警系统 相关资料链接下载摘要Abstract第1章 绪论1.1课题的背景1.2 研究的目的和意义 第2章 系统总体方案设计2.1 设计要求2.2 方案选择和论证2.2.1 单片机的选择2.2.2 显示方案的选择 第3章 系统硬件设计3.1 整体方案设计3.1.1 系统概述3.1.2 系…

C#通过异或(^)运算符制作二进制加密(C#实现加密)

快速了解异或运算符&#xff1a; 异或运算符在C#中用 “^” 来表示 口诀&#xff1a;相同取0&#xff0c;相异取1 简单加密解密winform示例&#xff1a; /// <summary>/// 异或运算符加密实现/// </summary>/// <param name"p_int_Num">初始值<…

生成式 AI 与向量搜索如何扩大零售运营:巨大潜力尚待挖掘

在竞争日益激烈的零售领域&#xff0c;行业领导者始终在探索革新客户体验和优化运营的新途径&#xff0c;而生成式 AI 和向量搜索在这方面将大有可为。从个性化营销到高效库存管理&#xff0c;二者在零售领域的诸多应用场景中都展现出变革性潜力&#xff0c;已成为保持行业领先…

云电脑的真实使用体验

最近这几年&#xff0c;关于云电脑的宣传越来越多。 小枣君之前曾经给大家介绍过云电脑&#xff08;链接&#xff09;。简单来说&#xff0c;它属于云计算的一个应用。通过在云端虚拟出一些虚拟电脑&#xff0c;然后让用户可以远程使用&#xff08;仍然需要借助本地电脑&#x…

使用爬虫爬取Python中文开发者社区基础教程的数据

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

CANoe_C#调用CDD和CAPL调用CDD方法对比

引言 在汽车电子系统的开发和测试中,CANoe作为一款强大的网络仿真工具,广泛应用于各种通信协议的模拟和验证。为了实现复杂的测试场景,开发者可以使用不同的编程语言和方法来调用CANoe的功能。其中,C#和CAPL(CANoe Programming Language)是两种常用的编程方式。本文将对…

Golang | Leetcode Golang题解之第498题对角线遍历

题目&#xff1a; 题解&#xff1a; func findDiagonalOrder(mat [][]int) []int {m, n : len(mat), len(mat[0])ans : make([]int, 0, m*n)for i : 0; i < mn-1; i {if i%2 1 {x : max(i-n1, 0)y : min(i, n-1)for x < m && y > 0 {ans append(ans, mat[x…

学习笔记——交换——STP(生成树)工作原理

三、工作原理 STP的基本原理是在一个有二层环路的网络中&#xff0c;交换机通过运行STP&#xff0c;自动生成一个没有环路的网络拓扑。这个无环网络拓扑也叫做STP树(STP Tree)&#xff0c;树节点为某些交换机&#xff0c;树枝为某些链路。当网络拓扑发生变化时&#xff0c;STP…

《汇编语言》第15章——实验15安装新的 int 9 中断例程

安装新的 int9 中断例程 安装一个新的 int 9 中断例程&#xff0c;功能:在 DOS 下&#xff0c;按下A键后&#xff0c;除非不再松开如果松开&#xff0c;就显示满屏幕的A&#xff0c;其他的键照常处理。 提示&#xff0c;按下一个键时产生的扫描码称为通码&#xff0c;松开一个…

云计算作业一hadoop:问题解决备忘

教程地址&#xff1a;https://blog.csdn.net/qq_53877854/article/details/142412784 修改网络配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33在root用户下编辑 静态ip地址配置后查看ip与配置不符 注意&#xff1a;确保在这之前已经在VMware的编辑>虚拟网络编…

OpenCV中的图像通道合并

在计算机视觉和图像处理领域&#xff0c;OpenCV是一个强大的工具库&#xff0c;它提供了从基本操作到复杂算法的广泛功能。今天&#xff0c;我们将通过一个简单的示例来探索OpenCV中的图像通道处理&#xff0c;特别是如何操作和理解BGR与RGB颜色空间的差异。 Lena图像&#xf…

WSL迁移到D盘

迁移WSL 下的 ubuntu 到D盘 使用工具LxRunOffline 如果出现下面的错误 使用其他版本 [ERROR] Couldnt set the case sensitive attribute of the directory "\\?\C:\Users\admin\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04LTS_79rhkp1fndgsc\LocalState…

TwinCAT3运动路径生成与执行

右键MAIN&#xff0c;点击Add添加Action&#xff0c;添加如下俩个名称的Action 在MAIN中添加如下代码&#xff1a; 在俩个Action中分别添加如下代码&#xff1a; 在MAIN程序中输入如下代码&#xff1a; 选择激活配置 弹出的对话框选择OK 弹出的对话框选择确定&…

Web前端高级工程师培训:使用 Node.js 构建一个 Web 服务端程序(3)

11、HTTP 协议 11-1、协议的定义 HTTP 是一种能够获取如 HTML 这样的网络资源的 protocol(通讯协议)。它是在 Web 上进行数据交换的基础&#xff0c;是一种 client-server 协议&#xff0c;也就是说&#xff0c;请求通常是由像浏览器这样的接受方发起的。一个完整的Web文档通…

【解决】使用Hypermark将Markdown文件转化为HTML文件

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 文章目录 一、文件准备&#xff08;一&#xff09;HTML模板文件&#xff08;二&#xff09;MD文件夹和储存文件夹 二、文件转…

【C++贪心】1536. 排布二进制网格的最少交换次数|1880

本文涉及知识点 C贪心 决策包容性 LeetCode1536. 排布二进制网格的最少交换次数 给你一个 n x n 的二进制网格 grid&#xff0c;每一次操作中&#xff0c;你可以选择网格的 相邻两行 进行交换。 一个符合要求的网格需要满足主对角线以上的格子全部都是 0 。 请你返回使网格满…

QUIC 启动!

掘金地址&#xff1a;https://juejin.cn/post/7428200842229006377 引言 QUIC是什么&#xff1f;明明你每天都在用&#xff0c;明明每天都在timing&#xff0c;难道你不知道吗&#xff1f;啊&#xff1f;不会吧&#xff0c;不会吧。 那就让本文来让你全方位的了解这个协议。 …

word表格跨页后自动生成的顶部横线【去除方法】

Hello World! Its been a long time. 这一年重心放在了科研、做事、追寻新的经历上&#xff0c;事有正事、琐事、幸事、哀事&#xff0c;内心与认知成长了一些&#xff0c;思想成熟了几分&#xff0c;技艺也有若干收获。不管怎样&#xff0c;来打个卡吧&#xff0c;纪念一下&…

爬虫日常实战

爬取美团新闻信息&#xff0c;此处采用两种方法实现&#xff1a; 注意点&#xff1a;因为此处的数据都是动态数据&#xff0c;所以一定要考虑好向下滑动数据包会更新的情况&#xff0c;不然就只能读取当前页即第一页数据&#xff0c;方法一通过更新ajax数据包网址页数&#xf…