[剑指Offer]面试题35:第一个只出现一次的字符

C#版 - 剑指Offer 面试题35:第一个只出现一次的字符 解题报告 C#版 - 剑指Offer 面试题35:第一个只出现一次的字符 解题报告 题目描述 找出字符串中第一个只出现一次的字符 输入描述: 输入一个非空字符串 输出描述: 输出第一个只出现一次的字符,如果不存在输出-1 示例1 输入 asdfasdfo 输出 o 思路:使用Dictionary<char, int& 阅读详情
题目

给定一个字符串,求第一个不重复的字符 abbcad -> c

解题思路:

今天中午面试的时候第二题我的思路是从头开始扫描字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较。如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符串相比较,因此这种思路的时间复杂度为O(n^2)。

这不是最好的做法,更好的做法时间复杂度应该是O(n)。


后来我回去仔细想了下,拓展思维想到能不能借助辅助容器的思路,然后采用Java中的数据容器来存放每个字符出现的次数。
为了解决这个问题,可以定义LinkedHashMap的键(key)是字符,而值(value)是该字符出现的次数。

思路:

我们需要从头开始扫描字符串两次,第一次扫描字符串时,每扫描到一个字符就在哈希表的对应项把次数加1。接下来第二次扫描时,每扫描到一个字符就能从哈希表中得到该字符出现的次数。这样第一个只出现一次的字符就是符合要求的输出。

时间复杂度分析:

第一个for循环中在哈希表中更新一个字符出现的次数的时间复杂度是O(n)。第二个for时间复杂度也是O(n),两个for循环最多执行2n次,总共的时间复杂度是O(n),符合题目的要求。

代码实现:
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;

public class Main {

    public static void main(String[] args) {
        System.out.println(get("alibaba"));
        System.out.println(get("taobao"));
        System.out.println(get("aabbccd"));
        System.out.println(get("ddbbdd"));
        System.out.println(get("ahsdkdhask"));
    }

    /**
     * 返回第一个不重复的字符
     * @param s 所求的字符串
     * @return  如果有返回该字符,如果不存在不重负的字符,返回null
     */
    public static Character get(String s) {
        // 判断边界条件
        if (s == null || s.length() < 1) {
            // 抛出异常
            throw new IllegalArgumentException("should not be null or empty");
        }
        Map<Character, Integer> map = new LinkedHashMap<Character, Integer>();
        int len = s.length();

        for (int i = 0; i < len; i++) {
            char c = s.charAt(i);
            Integer already = map.get(c);
            already = (already == null) ? 0 : already;
            map.put(s.charAt(i), ++already);
        }

        Set<Map.Entry<Character, Integer>> entries = map.entrySet();
        for (Map.Entry<Character, Integer> entry : entries) {
            if (entry.getValue() == 1) {
                return entry.getKey();
            }
        }
        return null;
    }
}

运行结果正确,如果没有返回null。

剑指offer 第二版 答案解析 剑指offer 第二版 答案解析,详细讲解过程和测试用例。 立即下载

相关推荐

【剑指Offer】35.数组中的逆序对(Python实现)

题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P00000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于P的数据,size<=10^4 对于u的数据,size<=10^5 对于0的数据,size<=2*10^5 示例1 输入 1,2,3,4,5,6,7,0 输出 7 解法一:辅助函数/递归法 class Solution: def InversePairs(self, data):

《剑指 Offer 》—50. 第一个只出现一次的字符

《剑指 Offer 》—50. 第一个只出现一次的字符

小贺想改变 375

学习stm32H7之路开始(STM32H7系列1) 前期准备,HAL库框架

2020.01.07 几个重要的参考网址 1.电子工程世界网 http://tags.eeworld.com.cn/tags/STM32H7 链接: link. 2.转:https://blog.youkuaiyun.com/simon223/article/list/2?t=1 链接: link. ———————————————— 版权声明:本文为优快云博主「Simon223」的原创文章,遵循 CC 4....

kengkengkeng963的博客 3408

【leetcode】剑指 Offer 35. 复杂链表的复制(python)

思路:哈希表 利用哈希表的查询特点,考虑构建 原链表节点 和 新链表对应节点 的键值对映射关系,再遍历构建新链表各节点的 next 和 random 引用指向即可。 详细请看leetcode题解,本文仅个人take notes """ # Definition for a Node. class Node: def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None): self.val = int(x.

Rudy的博客 516

RK3568下YT8531/YT8521 PHY移植避坑指南:RGMII与设备树详解

嵌入式Linux网络调试中,PHY芯片作为MAC与物理介质之间的桥梁,其驱动配置直接影响网络稳定性。RGMII接口的延时补偿、PHY地址设定以及复位时序是设备树配置中的关键环节,稍有差错便会出现链路已通却无法通信的现象。通过理解PHYLIB框架与mdio总线枚举原理,开发者可以快速定位寄存器级故障。在RK3568等工业级平台中,裕太微YT8531/YT8521凭借高性价比与内核主线支持,成为替代传统方案的热门选择。从设备树模板、内核配置到常见坑点,系统梳理千兆以太网PHY的移植与调试方法,帮助开发者少走弯路

weixin_29189381的博客 212

Synopsys SpyGlass 进行 RTL 功耗估计

通过上述脚本,您可以使用 Synopsys SpyGlass 对纯 RTL 代码和带有 FSDB 波形的 RTL 代码进行功耗估计,并支持将 SDC 文件转换为 SGDC 文件。

yumingqinglong的博客 2185

「剑指Offer 35.复杂链表的复制」

「剑指Offer 35.复杂链表的复制」 题目描述(level 中等) 请实现 copyRandomList函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个next指针指向下一个节点,还有一个random指针指向链表中的任意节点或者null。给定带有随机指针的Node结构如下: public class Node { private int val; private Node next; private Node random; public Node(int val) {

我有一壶酒,足以慰风尘 975

Chapter2、HDR流水线

HDR内容的获取(不同曝光时间的图片合成) 相机响应函数 HDR视频

qq_55621259的博客 2597

【剑指offer】面试题35:复杂链表的复制(Java)

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。 示例 1: 输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]] 输出:[[7,null],[13,0],[11,4],[10,2],[1,0]] 示例...

hx1043116928的博客 796

【Autosar】学习总结-MCAL

一、简介 MCAL:微控制器抽象层;位于BSW层中的最下层; MCAL细分,可将驱动分为:微控制器驱动、存储器驱动、通信驱动、IO驱动: 二、MCAL的配置(EB-Tresos) 1.PORT 我理解的PORT:MCAL层中的IO驱动组中的pin脚总体配置: Port就是芯片上的每个pin脚,可以配置成DIO ADC PWM ICU等单引脚的功能,也能配置成CAN的TX或者RX、SPI的MOSI等等其他功能的单个pin脚功能; 总之,PORT就是芯片上的具体的某个引脚。 配置

zDavid_2018的博客 3万+

【图像超分】论文精读:RepSR: Training Efficient VGG-style Super-Resolution Networks with Structural Re-Paramete

摘要: 本文提出RepSR,一种基于结构重新参数化和批量归一化(BN)的高效VGG式超分辨率网络。针对SR任务中BN易引发伪影的问题,作者通过分析发现训练-测试阶段的不一致性是主因,并提出先使用小批量统计训练、后期切换为总体统计的优化策略。RepSR块设计包含干净的残差路径和带改进BN的扩展-压缩卷积路径,有效平衡了训练非线性与推理效率。实验表明,RepSR在不同模型规模下优于现有重参数化方法,且实际推理速度更快。该工作为SR提供了性能与效率兼优的解决方案,相关代码未开源。 关键词: 超分辨率、结构重参数化

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 303

剑指offer(牛客网) - 第35题 - 第一个只出现一次的字符

题目 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符, 并返回它的位置, 如果没有则返回 -1(需要区分大小写). 解析 当访问大某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符,但是这样做的时间复杂度为O(n^2),我们希望找寻更快的方法。 方法一: 使用 HashMap 作为容器,将字...

weixin_44419313的博客 261

GPU:NVIDIA GPU的发展历史,nvidia-smi的简介、安装、使用方法之详细攻略

GPU:NVIDIA GPU的发展历史,nvidia-smi的简介、安装、使用方法之详细攻略 目录 NVIDIA GPU的发展历史 nvidia-smi的简介 1、nvidia-smi是nvidia 的系统管理界面解释相关参数含义 2、NVIDIA系统管理接口——v388.73 3、支持产品: nvidia-smi的安装 nvidia-smi的使用方法 1、列出所有可用的 NVIDIA 设备命令 2、nvidia-smi的基础命令用法 NVIDIA GPU的发展历

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 1万+

剑指offer:面试题35——第一个只出现一次的字符

剑指offer:面试题35——第一个只出现一次的字符 题目:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 思路:遍历一遍字符串,使用哈希表(ASCII 256位,这里用256位存储)按照字符串内对应的内容存储其字符出现的次数,然后再一次按照字符串顺序遍历哈希表,当前内容对应的位置如...

MereX的博客 654

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【一刷《剑指Offer》】面试题 35:第一个只出现一次的字符

如果需要判断多个字符是不是在某个字符串里出现过或者统计多个字符在某个字符串中出现的次数,我们可以考虑基于数组创建一个简单的哈希表,这样可以用很小的空间消耗换来时间效率的提升。例如从第一个字符串 "We are students." 中删除在第二个字符串 "aeiou" 中出现过的字符得到的结果是 "W r stdnts."。问题:在英语中,如果两个单词中出现的字母相同,并且每个字母出现的次数也相同,那么这两个单词互为变位词(Anagram)。问题:定义一个函数,删除字符串中所有重复出现的字符。

Elena's Blog 1074

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

剑指Offer之面试题35:第一个只出现一次的字符

所有代码均通过G++编译器测试,仅为练手纪录。 //面试题35:第一个只出现一次的字符。 //题目:在字符串中找出第一个只出现一次的字符。 //     如输入“abaccdeff”,则输出'b'。 //面试题35:第一个只出现一次的字符。 //题目:在字符串中找出第一个只出现一次的字符。 // 如输入“abaccdeff”,则输出'b'。 char F

Pillary的专栏 821

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【剑指Offer】面试题35:第一个只出现一次的字符

一:题目描述 在一个字符串(1 二:解题思路 (1)遍历字符串 创建一个数组,保存a-z  A-Z出现的次数: 1.没有出现过-1 2.只出现过一次,保存在字符串中的位置 3.出现超过一次,保存-2 (二)遍历数组 找到不为-1,同时不为-2的最小的值,即第一次只出现一次的字符 如果不存在这样的字符,返回-1 三:代码实现 class Solutio

曦曦慕慕的专栏 384

【剑指Offer学习】【面试题35:第一个只出现一次的字符】

题目:在字符串中找出第一个只出现一次的字符。 解题思路:第一种:直接求解:从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路的时间复杂度是O(n^2)。 第二种:记录法

https://github.com/Wang-Jun-Chao 5248

剑指offer——面试题35:第一个只出现一次的字符

题目:在一个字符串(1     代码: class Solution { public: int FirstNotRepeatingChar(string str) { int index = 0; if(str.empty()) return -1; // 空字符串,返回负值 const int tablesi

denghe优快云的博客 528

《剑指offer》面试题35:第一个只出现一次的字符(java实现)

在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). ——来源于《剑指offer》 解题思路:先遍历字符串,用一个哈希表将所有字符作为键,字符出现的次数作为值存入。然后再次遍历字符串,找到第一个值为1的字符的位置。 代码实现: public class Solution { ...

芊雨的博客 177

[剑指offer]面试题35:第一个只出现一次的字符

面试题35:第一个只出现一次的字符 题目:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出’b’。 代码如下: char FirstNotRepeatingChar(char *pString) { if (pString == nullptr) return '\0'; const int tableSize = 256; unsigned int hashTable[tableSize]; for (unsigned int i = 0; i < tableSiz

m0_51955470的博客 261

剑指Offer:面试题35 第一个只出现一次的字符

/* 第一个只出现一次的字符: 在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出'b' 分析: 直接对每个字符统计次数,用哈希做遍历,应该时间复杂度为O(n)。 寻找第一次出现的次数为1的字符时,我们按照字符顺序来遍历 题目描述: 在一个字符串(1 输入: 输入有多组数据 每一组输入一个字符串。 输出: 输出第一个只出现一次的字符下标,没有只出现一

qingyuanluofeng的专栏 724

剑指offer-面试题35:第一个只出现一次的字符

题目:在字符串中找出第一个只出现一次的字符。如输入“abaccdeff",则输出'b'。 思路:这道题目不难,遍历一遍统计每个字符出现的次数就完了。作者用的是哈希表,因为只需要统计次数,而且字符只有256中,可以用一个大小为256的数组实现。自己用STL里的map容器也实现了,道理完全一样。 //哈希表实现输出第一个只出现一次的字符 char FirstNotRepeatingChar(c

moses1213的专栏 478

剑指Offer面试题35:第一个只出现一次的字符

题目:第一个只出现一次的字符         在字符中找出第一个只出现一次的字符。如输入“abaccdeff”则,输出b. 算法分析: 算法1.最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某个字符时拿这个字符和后面的每个字符相比较,如果后面没有发现重复字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思想的时间复杂度

做一名努力的通信程序员 432
上一篇: [Android进阶]Binder学习(初始篇)
下一篇: [Android进阶]Android消息机制
陶程
博客等级 码龄12年 360粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值