剑指offer(C++)-JZ50:第一个只出现一次的字符(算法-其他)

news2025/1/12 23:17:57

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

在一个长为 字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)

数据范围:0≤n≤10000,且字符串只有字母组成。

要求:空间复杂度O(n),时间复杂度O(n)

示例:

输入:

"google"

返回值:

4

解题思路:

本题考察算法思维。两种解题思路:

1)哈希法

  1. 第一次循环用哈希表记录所有字符出现次数。
  2. 第二次循环找到首个出现次数为1的字符即可。

2)位运算

  1. 本质上和哈希法一样。因为字符只有字母,数量为26*2=52。每一位表示一个字符,比如字符b就是0010。
  2. 第一次循环用b记录出现过的字符,相应位数设为1,如果出现过了则flag对应位数也设为1。
  3. 第二次循环如果某个字符在b中对应位数为1,在flag中为0,则说明只出现过一次,完毕。

3)队列哈希法

  1. 该方法执行一次循环即可。
  2. 当字符首次出现,哈希表存储该字符位置,并将其放入队列中。
  3. 如果出现重复字符,则哈希表将该字符位置信息设为-1,即无效,并依次弹出队列中位置为-1的数据。注意,如果重复字符并非首个字符,则不进行弹出操作。如abcb,则不弹;如abcba,则将队列abc中的ab弹出,只剩下的c也就是答案。

测试代码:

1)哈希法

class Solution {
public:
    // 首个不重复字符
    int FirstNotRepeatingChar(string str) {
        int size = int(str.size());
        unordered_map<char, int> mp;
        // 统计每个字符出现的次数
        for(int i = 0; i < size; i++){
            mp[str[i]]++;
        }  
        // 找到第一个只出现一次的字母
        for(int i = 0; i < size; i++){
            if(mp[str[i]] == 1)
                return i;
        }  
        // 没有找到
        return -1;
    }
};

2)位运算

class Solution {
public:
    // 首个不重复字符
    int FirstNotRepeatingChar(string str) {
        int size = int(str.size());
        long long b = 0;
        long long flag = 0;
        // 统计每个字符出现的次数
        for(int i = 0; i < size; i++){
            int temp = str[i] - 'a';
            if(b & (1 << temp)){
                flag |= (1 << temp);
            }
            b |= (1 << temp);
        }  
        // 找到第一个只出现一次的字母
        for(int i = 0; i < size; i++){
            int temp = str[i] - 'a';
            if((b & (1 << temp)) && !(flag & (1 << temp))){
                return i;
            }
        }  
        //没有找到
        return -1;
    }
};

3)队列哈希法

class Solution {
public:
    // 首个不重复字符
    int FirstNotRepeatingChar(string str) {
        int size = int(str.size());
        unordered_map<char, int> mp;
        queue<pair<char, int> > q;
        // 统计字符出现的位置
        for(int i = 0; i < size; i++){
            // 没有出现过的字符
            if(!mp.count(str[i])){
                mp[str[i]] = i;
                q.push(make_pair(str[i], i));
            // 找到重复的字符
            }
            else{
                // 位置置为-1
                mp[str[i]] = -1;
                // 弹出前面所有的重复过的字符
                while(!q.empty() && mp[q.front().first] == -1)
                    q.pop();
            }
        }
        return q.empty() ? -1 : q.front().second;
    }
};

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

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

相关文章

传统鞋业焕发智造魅力,健康鞋步力宝品牌数字化转型助力多方把控

随着经济环境的变化以及市场竞争的加剧&#xff0c;加之我国劳动力、土地以及资源环境成本的快速上升&#xff0c;以劳动密集型为主、通过低附加值方式发展的传统产业集群遭遇瓶颈。而数字化时代的到来&#xff0c;不仅给各行各业带来了巨大的变革&#xff0c;也为传统鞋服业带…

王兴投资5G小基站

边缘计算社区获悉&#xff0c;近期深圳佳贤通信正式完成数亿元股权融资&#xff0c;本轮融资由美团龙珠领投。本轮融资资金主要用于技术研发、市场拓展等&#xff0c;将进一步巩固和扩大佳贤通信在5G小基站领域的技术及市场领先地位。 01 佳贤通信是什么样的公司&#xff1f; 深…

BIO实战、NIO编程与直接内存、零拷贝深入剖析

原生 JDK 网络编程 BIO BIO&#xff0c;意为 Blocking I/O&#xff0c;即阻塞的 I/O。   BIO 基本上就是我们上面所说的生活场景的朴素实现。在 BIO 中类 ServerSocket 负责绑定 IP 地址&#xff0c;启动监听端口&#xff0c;等待客户连接&#xff1b;客户端 Socket 类的实例…

倍福TwinCAT3.0软件与C++通讯问题(EAP通讯)

文章目录 一. TwinCAT控制器之间的几种通讯方式1.添加EAP设备2.添加变量刷新的Task周期3. 测试 一. TwinCAT控制器之间的几种通讯方式 协议硬件要求实时性说明ADS通讯普通网卡&#xff0c;支持无线典型值&#xff1a;< 100msServer/Client&#xff0c;要写 PLC 程序&#x…

全志R128芯片应用开发案例——ADC驱动烟雾传感器

ADC驱动烟雾传感器 本文案例代码下载地址ADC驱动烟雾传感器案例代码https://www.aw-ol.com/downloads?cat24 原理介绍 MQ-2型烟雾传感器属于二氧化锡半导体气敏材料&#xff0c;属于表面离子式N型半 导体。当处于200、300℃温度时&#xff0c;二氧化锡吸附空气中的氧&#…

网络端口验证

网络端口连通性验证 1、背景2、目标3、环境4、部署4.1、准备工作4.2、安装4.3、场景测试 1、背景 在日常运维过程中经常会遇到以下两种场景&#xff1a; 1、程序业务端口的开具及验证 2、业务程序访问异常网络排障 2、目标 1、验证端口的正确开具 2、网络策略的连通性 3、环…

onlyoffice的介绍搭建、集成过程。Windows、Linux

文章目录 什么是onlyoffice功能系统要求安装必备组件 windows搭建资源下载安装数据库onlyoffice安装测试 Linux搭建dockerdocker-compose 项目中用到的技术&#xff0c;做个笔记哈~ 什么是onlyoffice 在本地服务器上安装ONLYOFFICE Docs Community Edition Community Edition…

day06-前后端项目上传到gitee、后端多方式登录接口、发送短信功能、发送短信封装、短信验证码接口、短信登录接口

1 前后端项目上传到gitee 2 后端多方式登录接口 2.1 序列化类 2.2 视图类 2.3 路由 3 发送短信功能 4 发送短信封装 4.0 目录结构 4.1 settings.py 4.2 sms.py 5 短信验证码接口 6 短信登录接口 6.1 视图类 6.2 序列化类 1 前后端项目上传到gitee # 我们看到好多开源项目…

系列九、Redis的发布订阅

一、概述 Redis的发布订阅是进程间的一种消息通信模式&#xff0c;发送者&#xff08;Publisher&#xff09;发送消息&#xff0c;订阅者&#xff08;Subscriber&#xff09;接收消息。 二、命令 三、案例演示 3.1、订阅单个 客户端订阅 cctv-1、cctv-2、 cctv-3三个频道 SUB…

如何提高逻辑思维能力?

逻辑思维能力&#xff0c;对学习和工作效率具有直接的影响力&#xff0c;所以在企业招聘中&#xff0c;逻辑思维能力几乎是笔试的必考内容&#xff0c;当然目前招聘测评已经从纸笔测试&#xff0c;演变为在线测评&#xff0c;通常被称之为岗位胜任力测评&#xff0c;或者是综合…

优思学院:想成为质量工程师?了解质量工程师职责和能力是关键!

在职场中&#xff0c;质量工程师的角色显得至关重要。但如果你不清楚质量工程师的工作职责以及所需具备的能力&#xff0c;那么这个岗位可能会显得遥不可及。本文将为你详细介绍质量工程师的工作内容以及如何选择适合自己的质量工程师岗位。 一、质量工程师的工作职责 1. 质量…

30 分钟手把手带你入门数据脱敏

Bytebase 的动态数据脱敏 (Dynamic Data Masking) 可根据上下文即时屏蔽查询结果中的敏感数据。它可以帮助企业保护敏感数据&#xff0c;防止其暴露给未经授权的用户。 本教程将在 30 分钟内手把手教会你如何在 Bytebase 中设置和尝试数据脱敏。 在开始教程之前请确保已安装 D…

计算机网络 | 传输层

计算机网络 | 传输层 计算机网络 | 传输层功能概述 参考视频&#xff1a;王道计算机考研 计算机网络 参考书&#xff1a;《2022年计算机网络考研复习指导》 计算机网络 | 传输层 功能概述 传输层是主机才有的层次。 复用&#xff1a;发送方的不同应用进程都可以使用同一个传…

NeurIPS 2023 | AD-PT:首个大规模点云自动驾驶预训练方案

概要 自动驾驶领域的一个长期愿景是&#xff0c;感知模型能够从大规模点云数据集中学习获得统一的表征&#xff0c;从而在不同任务或基准数据集中取得令人满意的结果。之前自监督预训练的工作遵循的范式是&#xff0c;在同一基准数据集上进行预训练和微调&#xff0c;这很难实…

华为云云耀云服务器L实例评测|企业项目最佳实践之包管理工具安装软件(六)

华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践系列&#xff1a; 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之云服务器介绍(一) 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之华为云介绍(二) 华为云云耀云服务器L实例评测&#xff5…

10 | JpaSpecificationExecutor 实现的原理是什么

在开始讲解之前&#xff0c;请先思考几个问题&#xff1a; JpaSpecificationExecutor 如何创建&#xff1f;它的使用方法有哪些&#xff1f;toPredicate 方法如何实现&#xff1f; 带着这些问题&#xff0c;我们开始探索。先看一个例子感受一下 JpaSpecificationExecutor 具体…

09 | JpaSpecificationExecutor 解决了哪些问题

QueryByExampleExecutor用法 QueryByExampleExecutor&#xff08;QBE&#xff09;是一种用户友好的查询技术&#xff0c;具有简单的接口&#xff0c;它允许动态查询创建&#xff0c;并且不需要编写包含字段名称的查询。 下面是一个 UML 图&#xff0c;你可以看到 QueryByExam…

ReID的各种Loss的pytorch实现

为了提高ReID的性能通常会采用softmax loss 联合 Triplet Loss和Center Loss来提高算法的性能。 本文对Triplet Loss和Cnetr Loss做一个总结&#xff0c;以简洁的方式帮助理解。 Triplet Loss和Center Loss都是从人脸识别领域里面提出来的&#xff0c;后面在各种图像检索任务…

笔记本Win10系统一键重装操作方法

笔记本电脑已经成为大家日常生活和工作中必不可少的工具之一&#xff0c;如果笔记本电脑系统出现问题了&#xff0c;那么就会影响到大家的正常操作。这时候就可以考虑给笔记本电脑重装系统了。接下来小编给大家介绍关于一键重装Win10笔记本电脑系统的详细步骤方法。 推荐下载 系…