【LeetCode】剑指 Offer 50. 第一个只出现一次的字符 p243 -- Java Version

news2025/1/24 11:34:56

题目链接:https://leetcode.cn/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof/

1. 题目介绍(50. 第一个只出现一次的字符)

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。

在这里插入图片描述

【测试用例】:
示例1

输入:s = “abaccdeff”
输出:‘b’

示例2

输入:s = “”
输出:’ ’

【条件约束】:

限制

  • 0 <= s 的长度 <= 50000

【相关题目】

注意:本题与主站 387. 字符串中的第一个唯一字符 题目相同.

其它题目:

【题目1】: 从一个字符串中删除在另一个字符串中出现过的所有字符 (OR63 删除公共字符)。定义一个函数,输入两个字符串,从第一个字符串中删除在第二个字符串中出现过的所有字符。例如,输入 ”They are
students.” 和 ”aeiou” ,则删除之后的第一个字符串变成 ”Thy r stdnts.”
……
【Solution】:为了解决这个问题,我们可以创建一个用数组实现的简单 哈希表 来存储第二个字符串。这样我们从头到尾扫描第一个字符串的每个字符时,用 O(1) 时间就能判断出该字符是不是在第二个字符串中。如果第一个字符串的长度是 n, 那么总的时间复杂度是 O(n).

【题目2】:删除字符串中所有重复出现的字符(316. 去除重复字母)。定义一个函数,删除字符串中所有重复出现的字符。例如:输入“google”,删除重复字符之后的结果是“gole”。
……
【Solution】:我们可以创建一个 boolean数组 来实现简单的哈希表。数组中的元素的意义是其下标看作 ASCII 码后对应的字母在字符串中是否已经出现。 我们先把数组中所有的元素都设为 false。以 “google” 为例,当扫描到第一个 g 时,g 的 ASCII 码是 103,那么我们把数组中下标位103 的元素设为 true。当扫描到第二个 g 时,我们发现数组中下标位 103 的元素的值是 true,就知道 g 在前面已经出现过。
……
【Supplementary】:316. 去除重复字母 题目中除了要求去除重复字母,还要求返回值是 最小字典序。因此,在这一题中,我们还加入了 单调栈 来判断并存储 最小字典序的去重字符串。

【题目3】:变位词(剑指 Offer II 032. 有效的变位词)。该题有很多变形题,后面可以统一的练一练。在英语中,如果两个单词中出现的字母相同,且每个字母出现的次数也相同,那么这两个单词互为变位词(Anagram)。例如,silentlistenevillive 等互为变位词。请完成一个函数,判断输入的两个字符串是不是互为变位词。
……
【Solution】:我们可以创建一个用数组实现的简单 哈希表,用来统计字符串中每个字符出现的次数。

  • 当扫描到第一个字符串中的每个字符时,为哈希表对应的项的值增加1;
  • 接下来去扫描第二个字符串,当扫描到每个字符时,为哈希表对应的项的值减去1;
  • 如果扫描完第二个字符串后,哈希表中所有的值都是0,那么这两个字符串就互为变位词。

【举一反三】

如果需要判断 多个字符是不是在某个字符串里出现过 或者 统计多个字符在某个字符串中出现的次数,那么我们可以考虑 基于数组创建一个简单的哈希表,这样可以用很小的空间消耗换来时间效率的提升。

2. 题解

2.1 枚举 – O(n2)

时间复杂度O(n2),空间复杂度O(n)

解题思路】:
该题最直观的想法就是 从头开始扫描这个字符串中的每个字符。当访问到某字符时,拿这个字符和后面的每个字符相比较,如果字符串有 n 个字符,则每个字符可能与后面的 O(n) 个字符相比较,因此这种思路的时间复杂度是 O(n2)。
……
实现策略】:

  1. 双层循环遍历字符串,将每个字符都与字符串比较一遍;
  2. 通过变量 count 来记录当前字符在字符串中出现的次数,找出第一个无重复的字符后返回。
class Solution {
    // Solution1:枚举
    public char firstUniqChar(String s) {
        // 遍历每一个字符,寻找无重复的字符
        for (int i = 0; i < s.length(); i++){
            // 记录当前字符出现的次数
            int count = 0;
            char curr = s.charAt(i);
            for (int j = 0; j < s.length(); j++) {
                if (curr == s.charAt(j)) count++;
            }
            // 遍历完一遍字符串,如果count值为1,则返回
            if(count == 1) return curr;
        }
        // 没有无重复字符,返回单空格
        return ' ';
    }
}

在这里插入图片描述

2.2 哈希表 – O(n)

时间复杂度O(n),空间复杂度O(n)

解题思路】:
题目与字符出现的次数有关,那么我们就可以通过哈希表来统计每个字符在该字符串中出现的次数。哈希表的键为字符,值为该字符出现的次数。
……
实现策略】:

  1. 定义哈希表 map
  2. 第一次遍历字符串,存入哈希表,用来统计该字符串中字符分别出现的个数;
  3. 第二次遍历字符串,从哈希表中找出 值为1的字符 返回。
class Solution {
    // Solution2:哈希
    public char firstUniqChar(String s) {
        // 定义哈希表
        HashMap<Character,Integer> map = new HashMap<>(); 
        // 遍历一遍字符串,存入哈希表
        for (int i = 0; i < s.length(); i++){
           if (map.containsKey(s.charAt(i))) map.put(s.charAt(i),map.get(s.charAt(i)) + 1);
           else map.put(s.charAt(i),1);
        }
        // 第二次遍历字符串,找出第一个value值为1的返回
        for (int i = 0; i < s.length(); i++){
            if (map.get(s.charAt(i)) == 1) return s.charAt(i);
        }

        // 没有无重复字符,返回单空格
        return ' ';
    }
}

在这里插入图片描述

有序哈希表

解题思路】:
在哈希表的基础上,有序哈希表中的键值对是 按照插入顺序排序 的。基于此,可通过遍历有序哈希表,实现搜索首个 “数量为 1 的字符”。

Java 使用 LinkedHashMap 实现有序哈希表。 LinkedHashMap 底层借助哈希桶+双向链表,就是在hashmap的基础上通过双向链表维护元素节点间的顺序。如果想要查找效率快且维护插入顺序的话,用它就对啦,默认的就是按插入顺序排列。

class Solution {
    public char firstUniqChar(String s) {
        Map<Character, Boolean> dic = new LinkedHashMap<>();
        char[] sc = s.toCharArray();
        for(char c : sc)
            dic.put(c, !dic.containsKey(c));
        for(Map.Entry<Character, Boolean> d : dic.entrySet()){
           if(d.getValue()) return d.getKey();
        }
        return ' ';
    }
}

在这里插入图片描述

3. 参考资料

[1] 面试题50. 第一个只出现一次的字符(哈希表 / 有序哈希表,清晰图解)

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

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

相关文章

al文章生成-文章生成工具

ai文章生成器 AI文章生成器是一种利用人工智能和自然语言处理技术生成文章的工具。它使用先进的算法、机器学习和深度学习技术&#xff0c;深度挖掘和提取大量数据背后的信息&#xff0c;自主学习并合并新的信息&#xff0c;生成优质、原创的文章。 使用AI文章生成器的优点如下…

liunx mysql 主从同步设置 关键点

主库MySQL配置文件&#xff1a;该配置文件默认是在 /etc/my.cnf [mysqld] max_allowed_packet256M server-id1 log-binmysql-bin replicate-do-dbweb auto_increment_increment2 auto_increment_offset1 binlog_ignore_dbsys general_logon general_log_file/v…

Qt下载以及调试

1.概念 Qt是一个跨平台的基于C图形用户界面应用程序框架。 常见GUI&#xff1a; Qt&#xff1a;支持多平台&#xff1b;支持css&#xff1b;面向对象特性体现突出&#xff1b;发展趋势良好&#xff1b; MFC&#xff1a;仅在Windows&#xff1b;运行程序效率高&#xff1b;库安…

外包干了四年,感觉废了..

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

如何利用ventoy制作Linux to go (把deepin放到U盘里)

准备工作 最新版本 – 深度科技社区 (deepin.org) deepin镜像官方下载即可 Releases ventoy/vtoyboot GitHub ventoy启动插件选择1.0.29版本 Downloads – Oracle VM VirtualBox VirtualBox虚拟机官网 ventoy下载 VentoyRelease (lanzoui.com) 选择下载1.0.29版本 vento…

表格软件界的卷王,Excel、access、foxpro全靠边,WPS:真荣幸

Excel和Access就是表格软件的选择&#xff1f; 现在&#xff0c;铺天盖地的Excel的技能教程可谓是满天飞&#xff0c;有网上的教程&#xff0c;也有视频直播课程。 很多办公人员用Excel这种表格软件与VBA结合&#xff0c;甚至用不遗余力去学习Python编程语法&#xff0c;但Exce…

2023年会计师事务所研究报告

第一章 行业发展概况 1.1 行业概况 会计师事务所是专门从事财务、税务等领域的专业服务机构&#xff0c;其服务范围涵盖了审计、会计、税务、咨询等多个方面。 近年来&#xff0c;随着全球经济的不断发展和国际贸易的增加&#xff0c;会计师事务所行业也得到了快速发展。据统…

G8期刊《全体育》期刊简介及投稿要求

G8期刊《全体育》期刊简介及投稿要求 《全体育》是由湖南体育产业集团有限公司主管、体坛传媒集团股份有限公司主办、中教体育 出版发行的体育综合性期刊。 主管&#xff1a;湖南体育产业集团有限公司 主办&#xff1a;体坛传媒集团股份有限公司 国内刊号&#xff1a;CN4…

「实战教程」如何使用POI读取模板PPT填充数据并拼接至目标文件

文章目录一、PPT文件格式介绍1、PPT文件格式的概述2、HSLF和XSLF的区别3、如何选择合适的POI类库二、SlideShow三、读取PPT文件1. 加载PPT文件2. 获取PPT文件中的幻灯片3. 获取幻灯片中的形状元素四、修改PPT文件内容1. 幻灯片操作1.1 新增幻灯片1.2 删除幻灯片1.3 移动幻灯片1…

MySQL中count(1)和count(*)哪个性能好?

当我们对某一张表中的数据需要统计数量的时候&#xff0c;我们通常会用到count(1)、count(*)或者count(字段)&#xff0c;而这三种哪个方式的count效率最高呢&#xff1f;先来说结论&#xff1a; count(1) count(*) > count(字段) 为什么会得到如上的结论&#xff0c;下面来…

xilinx FPGA FIFO IP核的使用(VHDLISE)

1.新建工程和ip核文件 下图显示了一个典型的写操作。拉高WR_EN&#xff0c;导致在WR_CLK的下一个上升边缘发生写入操作。因为FIFO未满&#xff0c;所以WR_ACK输出1&#xff0c;确认成功的写入操作。当只有一个附加的单词可以写入FIFO时&#xff0c;FIFO会拉高ALMOST_FULL标志。…

图数据结构与算法

什么是图数据的结构 图是由顶点和边组成的非线性数据结构。顶点有时也称为节点,边是连接图中任意两个节点的线或弧。更正式地说,图由一组顶点 ( V ) 和一组边 ( E ) 组成。该图由 G(E, V) 表示。 图的组成部分 顶点:顶点是图的基本单位。有时,顶点也称为顶点或节点。每个节…

私有化部署VideoTogether一起看视频

本文折腾始于 2022 年 9 月&#xff0c;但因为种种原因并未写完&#xff0c;最近&#xff0c;因为有朋友需要&#xff0c;又重新开始捡了起来&#xff0c;然而&#xff0c;我发现官方已经把私有化部署的相关文档删了&#xff0c;原因不得而知。 什么是 VideoTogether ? VideoT…

拥抱自动化测试,快速升职加薪丄Selenium+Pytest自动化测试框架教你如何做到

目录&#xff1a;导读 引言 SeleniumPytest自动化测试框架是目前最流行的自动化测试工具之一&#xff0c;其强大的功能和易用性援助许多开发人员和测试人员。 selenium自动化 pytest测试框架禅道实战 选用的测试网址为我电脑本地搭建的禅道 conftest.py更改 config.ini更…

【权限维持】域控后门SSPHOOKDSRMSID万能钥匙

文章目录内网域-权限维持-基于验证DLL加载-SSP方法一&#xff1a;但如果域控制器重启&#xff0c;被注入内存的伪造的SSP将会丢失。方法二&#xff1a;使用此方法即使系统重启&#xff0c;也不会影响到持久化的效果。使用总结内网域-权限维持-基于验证DLL加载-HOOK方法一&#…

esxi的安装配置以及新建虚拟机

esxi的安装配置以及新建虚拟机1_esxi的安装1.1_镜像下载1.2_启动盘制作1.3_安装教程1.3.1_进入Bios Manager选择使用U盘启动1.3.2_配置esxi&#xff08;主要是配置网络&#xff09;1.3.3_远程连接&#xff08;直接在电脑上输入ip地址登录即可&#xff09;2_新建虚拟机装操作系统…

没有他们,人工智能只能死翘翘

我过去写过一篇文章《很多所谓伟大的贡献&#xff0c;其实都是狗屎运》&#xff0c;今天我也写写人工智能。&#xff08;1&#xff09;人才深度神经网络如果不从明斯基和罗森布拉特说起&#xff0c;那就应该可以从1965年Ivakhnenko发明前馈神经网络说起。但关键里程碑是出自Rum…

Socket套接字编程(实现TCP和UDP的通信)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

设置Pycharm的背景颜色(样式)、图片

目录 一、效果 二、背景图片 三、背景颜色 一、效果 二、背景图片 1.打开Pycharm中的File-Settings 2.点击Appearance & Behavior中的Appearance&#xff0c;然后点击Bcakground Image &#xff08;图中已标明顺序&#xff09; 3.找到图片并选中。 &#xff08;图中已…

[JavaEE]----Spring01

文章目录Spring_day011&#xff0c;课程介绍1.1 为什么要学?1.2 学什么?1.3 怎么学?2&#xff0c;Spring相关概念2.1 初识Spring2.1.1 Spring家族2.1.2 了解Spring发展史2.2 Spring系统架构2.2.1 系统架构图2.2.2 课程学习路线2.3 Spring核心概念2.3.1 目前项目中的问题2.3.…