首页IT科技字符串中第一次只出现一次的字符(每日算法之字符流中第一个不重复的字符)

字符串中第一次只出现一次的字符(每日算法之字符流中第一个不重复的字符)

时间2025-09-19 02:58:28分类IT科技浏览7001
导读:JZ75 字符流中第一个不重复的字符 题目 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符...

JZ75 字符流中第一个不重复的字符

题目

请实现一个函数用来找出字符流中第一个只出现一次的字符                   。例如                  ,当从字符流中只读出前两个字符 "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 #; } }

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
linux安装网卡命令(Linux系统基础笔记之网卡安装一般步骤简介) java里string和char的区别(java中String类型的相关知识的简单总结)