剑指 Offer 50. 第一个只出现一次的字符
题目描述
我的题解
(方法三应用更广泛;方法一虽有限制,但很好用,此题中该方法效率也最高)
方法一:(适用于范围确定的)
思路分析
- 该字符串只包含小写字母,即字符种类最多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. 第一个只出现一次的字符的更多相关文章
- 剑指 Offer 50. 第一个只出现一次的字符 + 哈希表 + 有序哈希表
剑指 Offer 50. 第一个只出现一次的字符 Offer_50 题目详情 方法一:使用无序哈希表 package com.walegarrett.offer; /** * @Author Wale ...
- 每日一题 - 剑指 Offer 50. 第一个只出现一次的字符
题目信息 时间: 2019-07-03 题目链接:Leetcode tag:哈希表 难易程度:简单 题目描述: 在字符串 s 中找出第一个只出现一次的字符.如果没有,返回一个单空格. s 只包含小写字 ...
- 【力扣】剑指 Offer 50. 第一个只出现一次的字符
在字符串 s 中找出第一个只出现一次的字符.如果没有,返回一个单空格. s 只包含小写字母. 示例: s = "abaccdeff"返回 "b" s = &qu ...
- [剑指offer] 50. 第一个只出现一次的字符 + map,hashmap 及其区别
class Solution { public: int FirstNotRepeatingChar(string str) { map<char,int>mp; ;i<str.si ...
- 【剑指Offer】第一个只出现一次的字符 解题报告(Python)
[剑指Offer]第一个只出现一次的字符 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervie ...
- Go语言实现:【剑指offer】第一个只出现一次的字符位置
该题目来源于牛客网<剑指offer>专题. 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1( ...
- 《剑指offer》第一个只出现一次的字符
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:
- 剑指Offer:第一个只出现一次的字符
题目:在字符串中找出第一个只出现一次的字符.如输入"abaccdeff",这输出'b' // 第一个只出现一次的字符 #include <stdio.h> char f ...
- 剑指OFFER之第一个只出现一次的字符(九度OJ1283)
题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据每一组输入一个字符串. 输出: 输出第一个只出现一次的字 ...
随机推荐
- 自适应高度输入框(contenteditable/textarea)
一.用div模拟textarea div模拟输入域可以根据输入内容自动伸缩,而input和textarea输入内容较多时,高度固定,内容会显示不全. 1.坑1(IOS端无法输入) 在取消全局默认样 ...
- 基础设计模式-03 从过滤器(Filter)校验链学习职责链模式
1.职责链路模式 1.1UML图 1.2 职责链路模式的概念 为了避免处理对象的耦合关系,将对象连成一个链,沿着这个链进行访问,直到有一个对象处理位置: 1.3 优点 1.按照一定的顺序执行判断: 2 ...
- centos7安装Mysql爬坑记录
centos7安装Mysql爬坑记录 查看是否已安装 使用下列命令查看是否已经安装过mysql/mariadb/PostgreSQL 如果未安装,不返回任何结果(ECS的centos镜像默认未安装 ...
- 状压DP之LGTB 与序列
题目 思路 这道题竟然是状压DP,本人以为是数论,看都没看就去打下一题的暴力了,哭 \(A_i\)<=30,所以我们只需要考虑1-58个数,再往后选的话还不如选1更优,注意,1是可以重复选取的, ...
- 线下---复习day04
目录 1 Django与Ajax 2分页器组件 3 forms组件 4cookie与session组件 5中间件组件 6Auth模块 作业: 1 Django与Ajax # 通过ajax向https: ...
- 师兄大厂面试遇到这条 SQL 数据分析题,差点含泪而归!
写在前面:我是「云祁」,一枚热爱技术.会写诗的大数据开发猿.昵称来源于王安石诗中一句 [ 云之祁祁,或雨于渊 ] ,甚是喜欢. 写博客一方面是对自己学习的一点点总结及记录,另一方面则是希望能够帮助更多 ...
- JVM 专题二:虚拟机(二)Java虚拟机
2.1 什么是Java虚拟机? Java虚拟机是一台执行字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成. JVM平台的各种语言可以共享Java虚拟机带来的 ...
- 前端02 /HTML标签
前端02 /HTML标签 目录 前端02 /HTML标签 1.特殊字符 2.标签分类 标签嵌套 1.块级标签(行内标签) 1.1div标签(块标签) 1.2p标签(块标签) 2.内联标签 2.1 sp ...
- It is indirectly referenced from required .class files错误查找的解决办法如下
It is indirectly referenced from required .class files 原因:是JDK引入有问题导致的 解决方案:我之前是错误的引入成了JRE 坑哇!!!,改成如 ...
- java中int相除取小数点后两位或限定位数
java 两个整数相除保留两位小数: http://blog.sina.com.cn/s/blog_624d755d0101cvuq.html java中,当两个整数相除时,由于小数点以后的数字会被截 ...