(Java 剑指 offer)字符流中第一个不重复的字符
程序员文章站
2022-06-17 16:15:44
...
一、题目解析
请实现一个函数用来找出字符流中第一个只出现一次的字符。
例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
如果当前字符流没有存在出现一次的字符,返回#字符。
本题如果不看牛客上的核心代码,我首先想到的是利用字符串获取首位和末位索引的方式判断字符是否是只出现一次(string.indexOf()和string.lastIndexOf()
),但是给的核心代码是:
这就不好操作了,这里需要先插入字符串,然后再查找第一个只出现1次的字符:
可以看出这其实是一个对应关系,key-value 的对应关系,所以可以利用 linkedHashMap
(无序存放,key不允许重复)
二、代码
import java.util.LinkedHashMap;
import java.util.Map;
public class Solution {
//map 用来记录每个字符出现的次数
Map<Character, Integer> linkedHashMap = new LinkedHashMap<>();
//Insert one char from stringstream
public void Insert(char ch)
{
//如果字符 ch 已经存储,则存储次数加 1,否则存储一次
if (linkedHashMap.containsKey(ch)) {
linkedHashMap.put(ch, linkedHashMap.get(ch) + 1);
} else {
linkedHashMap.put(ch, 1);
}
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce()
{
//如果当前字符流没有存在出现一次的字符,返回#字符。
char ch = '#';
for (Map.Entry<Character, Integer> map : linkedHashMap.entrySet()) {
if (map.getValue() == 1) {
ch = map.getKey();
break;
}
}
return ch;
}
}
三、总结
(1)LinkedHashMap
是有序存放,读取顺序和存储顺序相同
(2)对于 map 集合的迭代输出:可以借助 foreach 输出:
for (Map.Entry<Character, Integer> map : linkedHashMap.entrySet()) {
if (map.getValue() == 1) {
ch = map.getKey();
break;
}
}
其他输出方式可以参考:Map 接口的学习
推荐阅读
-
剑指offer27:按字典序打印出该字符串中字符的所有排列
-
PHP获取字符流中第一个不重复字符的方法
-
剑指offer JZ54 字符流中第一个不重复的字符 Python 多解
-
剑指 offer代码最优解析——面试题35第一个只出现一次的字符
-
20200329-剑指offer-面试题48. 最长不含重复字符的子字符串(滑动窗口)
-
第一个只出现一次字符的位置 牛客网 剑指Offer
-
剑指offer——第一个只出现一次的字符位置
-
《剑指offer》-- 两个链表的第一个公共结点、链表中环的入口结点、删除链表中的重复结点
-
剑指offer两个面试案例 把字符串转换成整数 树中两个节点的最低公共祖先
-
剑指 Offer 48. 最长不含重复字符的子字符串