本题 题目链接

题目描述


我的题解

(方法三应用更广泛;方法一虽有限制,但很好用,此题中该方法效率也最高)

方法一:(适用于范围确定的)

思路分析

  • 该字符串只包含小写字母,即字符种类最多26个
  • 开一个数组yes[26],分别存放字母a-z所出现的次数。
  • 字符c对应的数组下标索引为为:c-97.
  • 我的代码中,为了节约空间,取的是byte类型数组:
    • 当某个字符出现次数<2,该字符对应的数组值+1;
    • 否则(即出现次数>=2,不符合题目要找的),不处理该字符对应的数组值(即不再+1,因为byte类型最大值为127,而题目数据可能出现某个字符出现次数多达50000的情况)。

代码如下

    public char firstUniqChar(String s) {
char[] chars = s.toCharArray();
byte[] yes = new byte[26];
for (char c : chars) {
if (yes[c-97]<2)yes[c-97]++;
}
char res = ' ';
for (char c : chars) {
if (yes[c-97]==1) {
res = c;
break;
}
}
return res;
}

方法二:哈希表

方法二的优化 是参考leetcode大佬的题解。大佬leetcode主页

思路分析

  • 创建一个哈希表:HashMap<Character, Boolean> dic。
  • 遍历字符串s 中的每个字符 c:
    • 若字符c第一次出现,则向dic中添加键值对:dic.put(c, true);
    • 若前面已经出现过,则修改键c的键值对:dic.put(c, false) 【字符c数量大于1,不符合题目要找的】;

代码如下:

    public char firstUniqChar(String s) {
Map<Character, Boolean> dic = new HashMap<>();
char[] chars = s.toCharArray(); for (char c : chars) { // 遍历字符串
dic.put(c, !dic.containsKey(c)); // 若dic中不包含键 c :则向dic中添加键值对 (c, True) ;
// 若包含键 c :则修改键c的键值对为 (c, False)。
}
char res = ' ';
// 再次遍历字符串s,查看哈希表中键 c对应的value值,找出第一个true
for (char c : chars) {
if (dic.get(c)) {
res = c;
break;
}
}
return res;
}

方法三:有序哈希表

方法三 是参考leetcode大佬的题解。大佬leetcode主页

思路分析

  • 在哈希表的基础上,有序哈希表中的键值对是 按照插入顺序排序 的。
  • 故在方法二的基础上, 对于数据量大的题目,方法三效率更高。
  • 方法二中,第二个for循环,遍历的是字符串s;而方法三中第二个for循环只需遍历有序哈希表即可(因哈希表是去重的,故减少了循环的次数,增加了效率)

代码如下

    public char firstUniqChar(String s) {
Map<Character, Boolean> dic = new LinkedHashMap<>();
char[] chars = s.toCharArray(); for (char c : chars) {
dic.put(c, !dic.containsKey(c)); // 若dic中不包含键 c :则向dic中添加键值对 (c, True) ;
// 若包含键 c :则修改键c的键值对为 (c, False)。
} for (Map.Entry<Character, Boolean> entry : dic.entrySet()) {
if (entry.getValue()) return entry.getKey();
}
return ' ';
}

剑指 Offer 50. 第一个只出现一次的字符的更多相关文章

  1. 剑指 Offer 50. 第一个只出现一次的字符 + 哈希表 + 有序哈希表

    剑指 Offer 50. 第一个只出现一次的字符 Offer_50 题目详情 方法一:使用无序哈希表 package com.walegarrett.offer; /** * @Author Wale ...

  2. 每日一题 - 剑指 Offer 50. 第一个只出现一次的字符

    题目信息 时间: 2019-07-03 题目链接:Leetcode tag:哈希表 难易程度:简单 题目描述: 在字符串 s 中找出第一个只出现一次的字符.如果没有,返回一个单空格. s 只包含小写字 ...

  3. 【力扣】剑指 Offer 50. 第一个只出现一次的字符

    在字符串 s 中找出第一个只出现一次的字符.如果没有,返回一个单空格. s 只包含小写字母. 示例: s = "abaccdeff"返回 "b" s = &qu ...

  4. [剑指offer] 50. 第一个只出现一次的字符 + map,hashmap 及其区别

    class Solution { public: int FirstNotRepeatingChar(string str) { map<char,int>mp; ;i<str.si ...

  5. 【剑指Offer】第一个只出现一次的字符 解题报告(Python)

    [剑指Offer]第一个只出现一次的字符 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervie ...

  6. Go语言实现:【剑指offer】第一个只出现一次的字符位置

    该题目来源于牛客网<剑指offer>专题. 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1( ...

  7. 《剑指offer》第一个只出现一次的字符

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  8. 剑指Offer:第一个只出现一次的字符

    题目:在字符串中找出第一个只出现一次的字符.如输入"abaccdeff",这输出'b' // 第一个只出现一次的字符 #include <stdio.h> char f ...

  9. 剑指OFFER之第一个只出现一次的字符(九度OJ1283)

    题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据每一组输入一个字符串. 输出: 输出第一个只出现一次的字 ...

随机推荐

  1. Xenon's Attack on the Gangs(树规)

    题干 Input Output Example Test 1: Test 2: 3 5 1 2 1 2 2 3 1 3 1 4 3 5 3 10 Tips 译成人话 给n个结点,n-1条无向边.即一棵 ...

  2. Django---进阶11

    目录 django中间件 如何自定义中间件 csrf跨站请求伪造 如何符合校验 csrf相关装饰器 补充知识点 重要思想 作业 django中间件 """ django中 ...

  3. Howdoo欢迎Mitel成为内容发布支持者

    原文链接:https://medium.com/howdoo/howdoo-welcomes-mitel-as-a-launch-supporter-4c40027d4dd1 “Mitel很高兴能够成 ...

  4. SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(五): 数据表设计、使用 jwt、redis、sms 工具类完善注册登录逻辑

    (1) 相关博文地址: SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(一):搭建基本环境:https://www.cnblogs.com/l-y-h/p ...

  5. Let's GO(二)

    人生苦短,Let's GO Let's GO(一) Let's GO(二) Let's GO(三) Let's GO(四) 今天我学了什么? 1. Map map:映射,使用散列表(hash)实现 m ...

  6. DVWA学习记录 PartⅤ

    File Upload 1. 题目 File Upload,即文件上传漏洞,通常是由于对上传文件的类型.内容没有进行严格的过滤.检查,使得攻击者可以通过上传木马获取服务器的webshell权限,因此文 ...

  7. Maven 专题(五):Maven核心概念详解(一)

    **Maven 的核心程序中仅仅定义了抽象的生命周期,而具体的操作则是由 Maven 的插件来完成的.**可是 Maven 的插件并不包含在 Maven 的核心程序中,在首次使用时需要联网下载. 下载 ...

  8. 数据库02 /MySQL基础数据类型、完整性约束、sql_mode模式

    2.MySQL基础数据类型.完整性约束.sql_mode模式 目录 2.MySQL基础数据类型.完整性约束.sql_mode模式 1. MySQL常用数据类型 MySQL常用数据类型预览 1. 1 数 ...

  9. mongodb(五):聚合操作(python)

    pymongo的聚合操作 数据类型样式 /* 1 */ { "_id" : ObjectId("5e5a32fe2a89d7c2fc05b9fc"), &quo ...

  10. 数据可视化之powerBI基础(六)Power BI的“问答”,你用过吗?

    https://zhuanlan.zhihu.com/p/64412190 ​本文来自星球嘉宾"海艳"的分享,关于Power BI的问答功能以及各项细节,海艳详细为大家逐一介绍,下 ...