本篇文章为你整理了每日算法之字符流中第一个不重复的字符(字符串中第一次只出现一次的字符)的详细内容,包含有字符串出现的不重复最长长度 字符串中第一次只出现一次的字符 字符串查找第一个不重复的字母 给定一个字符串,找出第一个不重复的字符 每日算法之字符流中第一个不重复的字符,希望能帮助你了解 每日算法之字符流中第一个不重复的字符。
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符 "go" 时,第一个只出现一次的字符是 "g"。
当从该字符流中读出前六个字符 “google" 时,第一个只出现一次的字符是"l"。
方法1 使用LinkedHashMap
算法实现
LinkedHashMap实现顺序插入,不过查询速度会比较慢
具体做法:
step 1:用哈希表统计每个字符的次数,是全局变量。
step 2:在Insert函数中对输入的字符,然后统计出现次数。
step 3:在FirstAppearingOnce函数遍历该字符串,对于每个字符查找哈希表,返回第一个计数为1的字符,则返回#。
package mid.JZ75字符流中第一个不重复的字符;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public class Solution {
Map Character,Integer map = new LinkedHashMap ();
//Insert one char from stringstream
public void Insert(char ch) {
map.put(ch, map.getOrDefault(ch, 0) + 1);
//return the first appearence once char in current stringstream
* LinkedHashMap实现顺序插入,不过查询速度会比较慢
* 运行时间 165ms
* 占用内存 15860KB
* @return
public char FirstAppearingOnce() {
for (Character character : map.keySet()) {
if (map.get(character) == 1) {
return character;
return #;
方法2 哈希表+字符串(推荐使用)
算法实现
又是一个找到是否重复的问题。我们还是可以用哈希表来记录各个字符出现的次数,
根据这样只要是字符串最前面且哈希表中次数为1的字符就是我们要找的。
具体做法:
step 1:准备一个字符串来记录输入的字符流,用哈希表统计每个字符的次数,二者都是全局变量。
step 2:在Insert函数中对输入的字符,加到字符串最后,然后统计出现次数。
step 3:在FirstAppearingOnce函数遍历该字符串,对于每个字符查找哈希表,返回第一个计数为1的字符,
如果遍历完字符串以后都没,则返回#。
package mid.JZ75字符流中第一个不重复的字符;
import java.util.HashMap;
import java.util.Map;
public class Solution2 {
StringBuilder sb = new StringBuilder();
Map Character,Integer map = new HashMap ();
//Insert one char from stringstream
public void Insert(char ch) {
sb.append(ch);
map.put(ch, map.getOrDefault(ch, 0) + 1);
//return the first appearence once char in current stringstream
* 运行时间 13ms
* 占用内存 9952KB
* @return
public char FirstAppearingOnce() {
for (int i = 0; i sb.length(); i++) {
if (map.get(sb.charAt(i)) == 1) {
return sb.charAt(i);
return #;
方法3 哈希表+字符串(推荐使用)
算法实现
除了使用字符串记录字符流,还可以用队列记录字符流,每次插入的时候,只需要将第一次出现的字符加入到队列中,然后正常计数。
查找第一个不重复出现的字符的时候,从队首开始查询哈希表,
如果出现次数为1,则返回该字符,如果不为1,则从队首将其弹出。
具体做法:
step 1:准备一个队列来记录输入的字符流,用哈希表统计每个字符的次数,二者都是全局变量。
step 2:在Insert函数中对输入的字符,加到队列最后,然后统计出现次数。
step 3:在FirstAppearingOnce函数中,不断检查队首元素直到队列为空,队首出现次数为1次,就返回,
队首出现次数不为1就弹出。,则返回#。
package mid.JZ75字符流中第一个不重复的字符;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
public class Solution3 {
Queue Character queue = new LinkedList ();
Map Character,Integer map = new HashMap ();
//Insert one char from stringstream
public void Insert(char ch) {
if (!map.containsKey(ch)) {
queue.offer(ch);
map.put(ch, map.getOrDefault(ch, 0) + 1);
//return the first appearence once char in current stringstream
* 运行时间 15ms
* 占用内存 9972KB
* @return
public char FirstAppearingOnce() {
while(!queue.isEmpty()) {
if (map.get(queue.peek()) == 1) {
return queue.peek();
} else {
queue.poll();
return #;
以上就是每日算法之字符流中第一个不重复的字符(字符串中第一次只出现一次的字符)的详细内容,想要了解更多 每日算法之字符流中第一个不重复的字符的内容,请持续关注盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。